14

For people that want to do a simple verification of a Monero address to ensure it has been entered correctly, what are some methods that can be employed?

254123179
  • 4,566
  • 4
  • 31
  • 57
ferretinjapan
  • 6,494
  • 2
  • 19
  • 47
  • Related question: https://monero.stackexchange.com/questions/1502/what-do-monero-addresses-have-in-common – nu everest Nov 05 '17 at 00:07
  • Full verification requires complex checks: See the addrCheck() function here: https://xmr.llcoins.net/js/site.js – nu everest Nov 06 '17 at 02:56

5 Answers5

12

Here is a simple regular expression and javascript code snippet that can be used to confirm a Monero address has been entered correctly.

Regular expression:

4[0-9AB][<insert-all-base-58-characters-here>]{93}

In Javascript:

addr_str.match(/4[0-9AB][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{93}/);

Credit goes to /u/binaryfate for the useful info.

ferretinjapan
  • 6,494
  • 2
  • 19
  • 47
  • 2
    It is also worth noting that this doesn't ensure that there are no typos (can't really check checksum with regular expressions), and that it's suitable only for regular addresses – JollyMort Sep 13 '16 at 18:00
  • 3
    To ferretinjapan, you might want to look at the code for steps 8 to 15 here. Might be beneficial to this question or for a new question. – dEBRUYNE Sep 13 '16 at 18:49
  • 1
    If you go on https://moneroaddress.org and type in both 41a and 41z, you'll notice it says "INVALID PREFIX" for 41a (but not for 41z), while the a character is part of Base58. Therefore, I think the regular expression posted is still a simplification. – dpzz Oct 08 '16 at 13:40
  • @dpzz According to JS code, lowest_address = "41d7FXjswpK1111111111111111111111111111111111111111111111111111111111111111111111111111112KhNi4" and highest_address = "4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQVmzCh57" I have no idea if that is technically correct. – Jonathan Cross Sep 20 '17 at 00:54
  • Should have a ^ at the front since the address must start with a 4 i.e. .match(/^4... – nu everest Nov 06 '17 at 02:15
  • @dpzz – That site is incorrect. Lowercase z is indeed one of the constituent characters of base58. Monero's base58 implementation clearly says it's base64 minus IO10+/, just like Bitcoin's implementation. – Adam Katz Nov 28 '22 at 17:17
2

This is better:

4[a-zA-Z|\d]{94}

And payment ID:

[0-9a-fA-F]{64} 
Asdax
  • 551
  • 4
  • 12
  • 1
    This does not check for base58 instead of base64. – James Cameron Nov 15 '16 at 10:21
  • The Payment ID is supposed to be hex, but can be 16 or 64 chars. The address regex is very loose and includes invalid characters plus a nonsense pipe character. Better see the selected answer as this one has big problems. – Jonathan Cross Sep 20 '17 at 01:04
1

There are some inappropriate regexes to the other answers here. At this time, only ferretinjapan's answer is correct, though it's a mouthful since it does not use ranges.

This regex will match (non-integrated) Monero addresses (subaddresses start with 8):

^[48][0-9AB][1-9A-HJ-NP-Za-km-z]{93}$

An integrated address has 106 or 136 characters and that the second character may be any base58 character (verification needed; this is a result of changing the netbyte prefix). Here's a regex to match just integrated (either 64-bit or full 256-bit) addresses:

^4[1-9A-HJ-NP-Za-km-z]{105}(?:[1-9A-HJ-NP-Za-km-z]{30})?$

To match any Monero address (standard, subaddress, integrated, or full 256-bit integrated):

^(?:[48][0-9AB]|4[1-9A-HJ-NP-Za-km-z]{12}(?:[1-9A-HJ-NP-Za-km-z]{30})?)[1-9A-HJ-NP-Za-km-z]{93}$

With any of these regexes, if you are extracting addresses from larger bodies of text, you likely want to replace the ^ and $ anchors with \b word boundary markers.

Adam Katz
  • 111
  • 4
0

My Java Example:

public static boolean MoneroValid(String addr)
{
    String regex = "^4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$";
    return addr.matches(regex);
}
jtgrassie
  • 19,111
  • 4
  • 14
  • 51
0

Long time ago someone pointed to me this regex to address

/4([0-9]|[A-B])(.){93}/

I belive its an more complete one, I am using it on PHP-Monero

Pedro Gaspar
  • 635
  • 3
  • 7