multichain-address-validator 0.0.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/chain-validators.d.ts +1 -1
- package/dist/chain-validators.js +20 -2
- package/dist/multichain-address-validator.d.ts +2 -1
- package/dist/multichain-address-validator.js +3 -3
- package/dist/validators/hedera_validator.d.ts +5 -0
- package/dist/validators/hedera_validator.js +8 -0
- package/dist/validators/index.d.ts +2 -0
- package/dist/validators/index.js +2 -0
- package/dist/validators/move_validator.d.ts +5 -0
- package/dist/validators/move_validator.js +8 -0
- package/dist/validators/ripple_validator.js +5 -1
- package/dist/validators/xlm_validator.d.ts +2 -1
- package/dist/validators/xlm_validator.js +11 -5
- package/package-lock.json +1295 -0
- package/package.json +4 -6
- package/src/chain-validators.ts +23 -2
- package/src/multichain-address-validator.ts +6 -4
- package/src/validators/hedera_validator.ts +10 -0
- package/src/validators/index.ts +2 -0
- package/src/validators/move_validator.ts +11 -0
- package/src/validators/ripple_validator.ts +6 -2
- package/src/validators/xlm_validator.ts +13 -5
- package/test/addresses/addresses.ts +10 -0
- package/test/addresses/aptos.json +6 -0
- package/test/addresses/bch.json +0 -5
- package/test/addresses/btc-testnet.json +5 -0
- package/test/addresses/btc.json +5 -5
- package/test/addresses/doge-testnet.json +3 -0
- package/test/addresses/doge.json +0 -1
- package/test/addresses/evm.json +0 -1
- package/test/addresses/hbar.json +11 -0
- package/test/addresses/monero-testnet.json +5 -0
- package/test/addresses/ripple.json +4 -0
- package/test/addresses/sia.json +0 -1
- package/test/addresses/sui.json +6 -0
- package/test/addresses/xlm.json +5 -1
- package/test/multichain-address-validator.test.ts +28 -1438
- package/tsconfig.json +1 -1
- package/config/esbuild.inject.js +0 -1
- package/config/esbuild.ts +0 -14
- package/dist/multichain-address-validator.bundle.min.js +0 -17
- package/test/addresses/invalid.json +0 -15
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "multichain-address-validator",
|
|
3
3
|
"description": "Multichain address validator for Bitcoin and other blockchains.",
|
|
4
|
+
"version": "0.7.1",
|
|
4
5
|
"keywords": [
|
|
5
6
|
"0x",
|
|
6
7
|
"zrx",
|
|
@@ -315,8 +316,7 @@
|
|
|
315
316
|
"ZenCash",
|
|
316
317
|
"zen"
|
|
317
318
|
],
|
|
318
|
-
"
|
|
319
|
-
"author": "Chris <chris.tsim@gmail.com>",
|
|
319
|
+
"author": "Chris <28301107+christsim@users.noreply.github.com>",
|
|
320
320
|
"homepage": "https://github.com/christsim/multichain-address-validator",
|
|
321
321
|
"license": "MIT",
|
|
322
322
|
"repository": {
|
|
@@ -326,14 +326,13 @@
|
|
|
326
326
|
"main": "dist/multichain-address-validator.js",
|
|
327
327
|
"type": "module",
|
|
328
328
|
"engines": {
|
|
329
|
-
"node": ">=
|
|
329
|
+
"node": ">=18.0.0"
|
|
330
330
|
},
|
|
331
331
|
"engineStrict": true,
|
|
332
332
|
"scripts": {
|
|
333
333
|
"build": "tsc",
|
|
334
|
-
"bundle": "tsx config/esbuild.ts",
|
|
335
334
|
"test": "mocha --import=tsx test/**.test.ts",
|
|
336
|
-
"start": "npm run build && npm
|
|
335
|
+
"start": "npm run build && npm test"
|
|
337
336
|
},
|
|
338
337
|
"dependencies": {
|
|
339
338
|
"@noble/hashes": "^1.4.0",
|
|
@@ -345,7 +344,6 @@
|
|
|
345
344
|
},
|
|
346
345
|
"devDependencies": {
|
|
347
346
|
"chai": "^4.4.1",
|
|
348
|
-
"esbuild": "^0.23.0",
|
|
349
347
|
"mocha": "^10.2.0",
|
|
350
348
|
"tsx": "^4.16.2",
|
|
351
349
|
"typescript": "^5.5.4"
|
package/src/chain-validators.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {Chain,
|
|
1
|
+
import type {Chain, Validator} from './types.js'
|
|
2
|
+
import { NetworkType } from './types.js'
|
|
2
3
|
|
|
3
4
|
import {
|
|
4
5
|
AlgorandValidator,
|
|
@@ -7,7 +8,9 @@ import {
|
|
|
7
8
|
CardanoValidator,
|
|
8
9
|
EOSValidator,
|
|
9
10
|
ETHValidator,
|
|
11
|
+
HederaValidator,
|
|
10
12
|
MoneroValidator,
|
|
13
|
+
MoveValidator,
|
|
11
14
|
NanoValidator,
|
|
12
15
|
NemValidator,
|
|
13
16
|
PolkadotValidator,
|
|
@@ -30,6 +33,7 @@ type ChainValidators = Record<string, {
|
|
|
30
33
|
|
|
31
34
|
const chainValidators: ChainValidators = {
|
|
32
35
|
algorand: {validator: AlgorandValidator},
|
|
36
|
+
aptos: {validator: MoveValidator},
|
|
33
37
|
bitcoin: {
|
|
34
38
|
alternatives: ['btc', 'omni'],
|
|
35
39
|
validator: {
|
|
@@ -71,9 +75,25 @@ const chainValidators: ChainValidators = {
|
|
|
71
75
|
},
|
|
72
76
|
eos: {validator: EOSValidator},
|
|
73
77
|
ethereum: {
|
|
74
|
-
alternatives: [
|
|
78
|
+
alternatives: [
|
|
79
|
+
'arbitrum',
|
|
80
|
+
'avalanche',
|
|
81
|
+
'avalanche-c',
|
|
82
|
+
'base',
|
|
83
|
+
'binance',
|
|
84
|
+
'bnb',
|
|
85
|
+
'bsc',
|
|
86
|
+
'eth',
|
|
87
|
+
'erc20',
|
|
88
|
+
'flare',
|
|
89
|
+
'sonic',
|
|
90
|
+
],
|
|
75
91
|
validator: ETHValidator
|
|
76
92
|
},
|
|
93
|
+
hedera: {
|
|
94
|
+
alternatives: ['hbar'],
|
|
95
|
+
validator: HederaValidator
|
|
96
|
+
},
|
|
77
97
|
litecoin: {
|
|
78
98
|
alternatives: ['ltc'],
|
|
79
99
|
validator: {
|
|
@@ -105,6 +125,7 @@ const chainValidators: ChainValidators = {
|
|
|
105
125
|
alternatives: ['spl'],
|
|
106
126
|
validator: SolanaValidator,
|
|
107
127
|
},
|
|
128
|
+
sui: {validator: MoveValidator},
|
|
108
129
|
tron: {
|
|
109
130
|
alternatives: ['trc20'],
|
|
110
131
|
validator: TronValidator(),
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {Address, Chain} from './types.js'
|
|
1
|
+
import {Address, Chain, NetworkType} from './types.js'
|
|
2
2
|
import {getValidatorForChain} from './chain-validators.js'
|
|
3
3
|
|
|
4
4
|
export function validate(address: Address, chain: Chain) {
|
|
5
5
|
const validator = getValidatorForChain(chain)
|
|
6
|
-
if (validator) {
|
|
7
|
-
|
|
6
|
+
if (!validator) {
|
|
7
|
+
throw new Error(`Missing validator for chain: ${chain}`);
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
return validator.isValidAddress(address);
|
|
11
11
|
}
|
|
12
|
+
|
|
13
|
+
export type { Address, Chain, NetworkType }
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type {Address} from '../types.js'
|
|
2
|
+
import {getAddress} from '../helpers.js'
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
isValidAddress(address: Address) {
|
|
6
|
+
// Regex to validate the format "shard.realm.account"
|
|
7
|
+
const regex = /^\d+\.\d+\.\d+$/;
|
|
8
|
+
return regex.test(getAddress(address));
|
|
9
|
+
}
|
|
10
|
+
};
|
package/src/validators/index.ts
CHANGED
|
@@ -4,7 +4,9 @@ export {default as BTCValidator} from "./bitcoin_validator.js"
|
|
|
4
4
|
export {default as CardanoValidator} from "./cardano_validator.js"
|
|
5
5
|
export {default as EOSValidator} from "./eos_validator.js"
|
|
6
6
|
export {default as ETHValidator} from "./ethereum_validator.js"
|
|
7
|
+
export {default as HederaValidator} from "./hedera_validator.js"
|
|
7
8
|
export {default as MoneroValidator} from "./monero_validator.js"
|
|
9
|
+
export {default as MoveValidator} from "./move_validator.js"
|
|
8
10
|
export {default as NemValidator} from "./nem_validator.js"
|
|
9
11
|
export {default as NanoValidator} from "./nano_validator.js"
|
|
10
12
|
export {default as PolkadotValidator} from "./polkadot_validator.js"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Address} from '../types.js'
|
|
2
|
+
import {getAddress} from '../helpers.js'
|
|
3
|
+
|
|
4
|
+
const regexp = new RegExp('^0x[0-9a-fA-F]{64}$');
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
isValidAddress(address: Address) {
|
|
8
|
+
const addr = getAddress(address)
|
|
9
|
+
return regexp.test(addr)
|
|
10
|
+
},
|
|
11
|
+
};
|
|
@@ -22,8 +22,12 @@ export default {
|
|
|
22
22
|
return validAddress && this.verifyMemo(destinationTag)
|
|
23
23
|
},
|
|
24
24
|
|
|
25
|
-
verifyMemo(destinationTag: string | null) {
|
|
26
|
-
|
|
25
|
+
verifyMemo(destinationTag: string | null): boolean {
|
|
26
|
+
if (!destinationTag) return true; // Optional
|
|
27
|
+
|
|
28
|
+
const tagNumber = Number(destinationTag);
|
|
29
|
+
// A destination tag is a 32-bit unsigned integer.
|
|
30
|
+
return /^[0-9]+$/.test(destinationTag) && tagNumber >= 0 && tagNumber <= 4294967295;
|
|
27
31
|
},
|
|
28
32
|
|
|
29
33
|
verifyChecksum: function (address: string) {
|
|
@@ -18,13 +18,21 @@ function swap16(number: number) {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export default {
|
|
21
|
-
isValidAddress(address: Address) {
|
|
21
|
+
isValidAddress: function (address: Address) {
|
|
22
22
|
const addr = getAddress(address)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
const destinationTag = (address as any).destinationTag
|
|
24
|
+
|
|
25
|
+
const validAddress = regexp.test(addr) && this.verifyChecksum(addr);
|
|
26
|
+
|
|
27
|
+
return validAddress && this.verifyMemo(destinationTag)
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
verifyMemo(memo: string | null): boolean {
|
|
31
|
+
if (!memo) return true; // Optional
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
// Ensure it's a valid UTF-8 string and does not exceed 28 bytes
|
|
34
|
+
const encoder = new TextEncoder();
|
|
35
|
+
return encoder.encode(memo).length <= 28;
|
|
28
36
|
},
|
|
29
37
|
|
|
30
38
|
verifyChecksum: function (address: string) {
|
|
@@ -1,26 +1,32 @@
|
|
|
1
1
|
import algorand from './algorand.json'
|
|
2
|
+
import aptos from './aptos.json'
|
|
2
3
|
import bch from './bch.json'
|
|
3
4
|
import bchTestnet from './bch-testnet.json'
|
|
4
5
|
import btc from './btc.json'
|
|
5
6
|
import btcTestnet from './btc-testnet.json'
|
|
6
7
|
import cardano from './cardano.json'
|
|
7
8
|
import doge from './doge.json'
|
|
9
|
+
import dogeTestnet from './doge-testnet.json'
|
|
8
10
|
import eos from './eos.json'
|
|
9
11
|
import evm from './evm.json'
|
|
12
|
+
import hbar from './hbar.json'
|
|
10
13
|
import ltc from './ltc.json'
|
|
11
14
|
import ltcTestnet from './ltc-testnet.json'
|
|
12
15
|
import monero from './monero.json'
|
|
16
|
+
import moneroTestnet from './monero-testnet.json'
|
|
13
17
|
import nem from './nem.json'
|
|
14
18
|
import nano from './nano.json'
|
|
15
19
|
import polkadot from './polkadot.json'
|
|
16
20
|
import ripple from './ripple.json'
|
|
17
21
|
import sia from './sia.json'
|
|
18
22
|
import solana from './solana.json'
|
|
23
|
+
import sui from './sui.json'
|
|
19
24
|
import tezos from './tezos.json'
|
|
20
25
|
import tron from './tron.json'
|
|
21
26
|
import xlm from './xlm.json'
|
|
22
27
|
|
|
23
28
|
export default {
|
|
29
|
+
aptos,
|
|
24
30
|
algorand,
|
|
25
31
|
bch,
|
|
26
32
|
'bch-testnet': bchTestnet,
|
|
@@ -28,16 +34,20 @@ export default {
|
|
|
28
34
|
'btc-testnet': btcTestnet,
|
|
29
35
|
cardano,
|
|
30
36
|
doge,
|
|
37
|
+
'doge-testnet': dogeTestnet,
|
|
31
38
|
eos,
|
|
32
39
|
evm,
|
|
40
|
+
hbar,
|
|
33
41
|
ltc,
|
|
34
42
|
'ltc-testnet': ltcTestnet,
|
|
35
43
|
monero,
|
|
44
|
+
'monero-testnet': moneroTestnet,
|
|
36
45
|
nem,
|
|
37
46
|
nano,
|
|
38
47
|
polkadot,
|
|
39
48
|
ripple,
|
|
40
49
|
sia,
|
|
50
|
+
sui,
|
|
41
51
|
solana,
|
|
42
52
|
tezos,
|
|
43
53
|
tron,
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
[
|
|
2
|
+
"0xaabf25b0c115130a4ad88bfa08627c5a103b7851e90869c23fadaf0512dd5133",
|
|
3
|
+
"0xdce6ab89a1d26c99491a70fd4a2536d065925114deee916a1ae7d35007f4dedf",
|
|
4
|
+
"0xd05448f15a03f25b2816c4538b72bd54752ba7522d4831a4c9ea5a613becb47a",
|
|
5
|
+
"0x39f521d22f611a4dec2f790fef2e4f8d1f96550509e85beccf8acec52c1a7219"
|
|
6
|
+
]
|
package/test/addresses/bch.json
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
[
|
|
2
2
|
"12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP",
|
|
3
3
|
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
4
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
5
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
6
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
7
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
8
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
9
4
|
"1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs",
|
|
10
5
|
"3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt",
|
|
11
6
|
"bitcoincash:qq4v32mtagxac29my6gwj6fd4tmqg8rysu23dax807"
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
[
|
|
2
2
|
"mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef",
|
|
3
3
|
"GSa5espVLNseXEfKt46zEdS6jrPkmFghBU",
|
|
4
|
+
"mptPo5AvLzJXi4T82vR6g82fT5uJ6HsQCu",
|
|
5
|
+
"mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef",
|
|
6
|
+
"2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7",
|
|
7
|
+
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
|
|
8
|
+
"GSa5espVLNseXEfKt46zEdS6jrPkmFghBU",
|
|
4
9
|
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
|
|
5
10
|
"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy"
|
|
6
11
|
]
|
package/test/addresses/btc.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
[
|
|
2
2
|
"12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP",
|
|
3
3
|
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
4
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
5
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
6
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
7
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
8
|
-
"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
|
|
9
4
|
"15uwigGExiNQxTNr1QSZYPXJMp9Px2YnVU",
|
|
10
5
|
"3FyVFsEyyBPzHjD3qUEgX7Jsn4tcHNZFkn",
|
|
11
6
|
"38mKdURe1zcQyrFqRLzR8PRao3iLGEPVsU",
|
|
12
7
|
"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
|
|
8
|
+
"1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs",
|
|
9
|
+
"1HVDCg2KrPBH1Mg5SK9fGjAR9KVqyMMdBC",
|
|
10
|
+
"1SQHtwR5oJRKLfiWQ2APsAd9miUc4k2ez",
|
|
11
|
+
"116CGDLddrZhMrTwhCVJXtXQpxygTT1kHd",
|
|
12
|
+
"3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt",
|
|
13
13
|
"bc1q2t63ewm3mvh0ztmnmezxm7s0tefknenxlrlwrk"
|
|
14
14
|
]
|
package/test/addresses/doge.json
CHANGED
package/test/addresses/evm.json
CHANGED
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
"0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359",
|
|
11
11
|
"0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB",
|
|
12
12
|
"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb",
|
|
13
|
-
|
|
14
13
|
"0xE37c0D48d68da5c5b14E5c1a9f1CFE802776D9FF",
|
|
15
14
|
"0xa00354276d2fC74ee91e37D085d35748613f4748",
|
|
16
15
|
"0xAff4d6793F584a473348EbA058deb8caad77a288",
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
[
|
|
2
|
+
"A2be3UvzMtkJtxRYgcCbQt2y7Rp2eLVGqNTWfZeankrWimSMM4y7uMP6B9oAZaHsXTj8KFSerkSkkVRuEuEca9QM8VhxCNU",
|
|
3
|
+
"9uXRFi4PZMqhsnthBF6bGdfVnBSZtfKkR7Td8qPM7jUKZeTfR1tLhCoTLqYNE12xuiQg3aWGiLw83bWsqwTRLaM4Jk47xYM",
|
|
4
|
+
"9tFTaQM39JXhULZsHauPHhjFrjcGSGXoijEPYoRgAky9Veck2mFp3EifQ2tKHmEHuuUoFfgYRNR2bVaborz5oi8JA8xkqjY"
|
|
5
|
+
]
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
"rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn",
|
|
4
4
|
"r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
|
|
5
5
|
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
|
6
|
+
{
|
|
7
|
+
"address": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
|
8
|
+
"destinationTag": 4294967295
|
|
9
|
+
},
|
|
6
10
|
"rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN",
|
|
7
11
|
{
|
|
8
12
|
"address": "rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN",
|
package/test/addresses/sia.json
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
[
|
|
2
|
-
"a9b01c85163638682b170d82de02b8bb99ba86092e9ab1b0d25111284fe618e93456915820f1",
|
|
3
2
|
"a9b01c85163638682b170d82de02b8bb99ba86092e9ab1b0d25111284fe618e93456915820f1",
|
|
4
3
|
"ab0c327982abfcc6055a6c9551589167d8a73501aca8769f106371fbc937ad100c955c3b7ba9",
|
|
5
4
|
"ffe1308c044ade30392a0cdc1fd5a4dbe94f9616a95faf888ed36123d9e711557aa497530373"
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
[
|
|
2
|
+
"0xaabf25b0c115130a4ad88bfa08627c5a103b7851e90869c23fadaf0512dd5133",
|
|
3
|
+
"0xdce6ab89a1d26c99491a70fd4a2536d065925114deee916a1ae7d35007f4dedf",
|
|
4
|
+
"0xd05448f15a03f25b2816c4538b72bd54752ba7522d4831a4c9ea5a613becb47a",
|
|
5
|
+
"0x39f521d22f611a4dec2f790fef2e4f8d1f96550509e85beccf8acec52c1a7219"
|
|
6
|
+
]
|
package/test/addresses/xlm.json
CHANGED
|
@@ -8,5 +8,9 @@
|
|
|
8
8
|
"GAJHORKJKDDEPYCD6URDFODV7CVLJ5AAOJKR6PG2VQOLWFQOF3X7XLOG",
|
|
9
9
|
"GACXQEAXYBEZLBMQ2XETOBRO4P66FZAJENDHOQRYPUIXZIIXLKMZEXBJ",
|
|
10
10
|
"GDD3XRXU3G4DXHVRUDH7LJM4CD4PDZTVP4QHOO4Q6DELKXUATR657OZV",
|
|
11
|
-
"GDTYVCTAUQVPKEDZIBWEJGKBQHB4UGGXI2SXXUEW7LXMD4B7MK37CWLJ"
|
|
11
|
+
"GDTYVCTAUQVPKEDZIBWEJGKBQHB4UGGXI2SXXUEW7LXMD4B7MK37CWLJ",
|
|
12
|
+
{
|
|
13
|
+
"address": "GDTYVCTAUQVPKEDZIBWEJGKBQHB4UGGXI2SXXUEW7LXMD4B7MK37CWLJ",
|
|
14
|
+
"destinationTag": "3fdsfsdfasdfdsfgasdgfdsfgas"
|
|
15
|
+
}
|
|
12
16
|
]
|