@rosen-bridge/address-codec 0.1.0 → 0.2.1-6770eb
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/CHANGELOG.md +13 -0
- package/dist/const.d.ts +1 -0
- package/dist/const.d.ts.map +1 -1
- package/dist/const.js +2 -1
- package/dist/decoder.d.ts.map +1 -1
- package/dist/decoder.js +7 -2
- package/dist/encoder.d.ts.map +1 -1
- package/dist/encoder.js +8 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/lib/const.d.ts +5 -0
- package/dist/lib/const.d.ts.map +1 -0
- package/dist/lib/const.js +5 -0
- package/dist/lib/decoder.d.ts +8 -0
- package/dist/lib/decoder.d.ts.map +1 -0
- package/dist/lib/decoder.js +31 -0
- package/dist/lib/encoder.d.ts +8 -0
- package/dist/lib/encoder.d.ts.map +1 -0
- package/dist/lib/encoder.js +37 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/types.d.ts +7 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +11 -0
- package/dist/lib/validator.d.ts +7 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +33 -0
- package/dist/tests/decoder.spec.d.ts +2 -0
- package/dist/tests/decoder.spec.d.ts.map +1 -0
- package/dist/tests/decoder.spec.js +84 -0
- package/dist/tests/encoder.spec.d.ts +2 -0
- package/dist/tests/encoder.spec.d.ts.map +1 -0
- package/dist/tests/encoder.spec.js +98 -0
- package/dist/tests/testData.d.ts +17 -0
- package/dist/tests/testData.d.ts.map +1 -0
- package/dist/tests/testData.js +17 -0
- package/dist/tests/validator.spec.d.ts +2 -0
- package/dist/tests/validator.spec.d.ts.map +1 -0
- package/dist/tests/validator.spec.js +145 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/validator.d.ts +7 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +33 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +18 -0
- package/lib/const.ts +1 -0
- package/lib/decoder.ts +11 -1
- package/lib/encoder.ts +12 -1
- package/lib/index.ts +1 -0
- package/lib/validator.ts +38 -0
- package/package.json +3 -2
- package/tests/decoder.spec.ts +20 -1
- package/tests/encoder.spec.ts +35 -1
- package/tests/testData.ts +16 -0
- package/tests/validator.spec.ts +164 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN, ETHEREUM_CHAIN, } from './const';
|
|
2
|
+
import { UnsupportedAddressError, UnsupportedChainError } from './types';
|
|
3
|
+
import * as ergoLib from 'ergo-lib-wasm-nodejs';
|
|
4
|
+
import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
|
|
5
|
+
import * as bitcoinLib from 'bitcoinjs-lib';
|
|
6
|
+
import * as ethereumLib from 'ethers';
|
|
7
|
+
/**
|
|
8
|
+
* validates address of a chain
|
|
9
|
+
* @param chain
|
|
10
|
+
* @param address
|
|
11
|
+
*/
|
|
12
|
+
export const validateAddress = (chain, address) => {
|
|
13
|
+
switch (chain) {
|
|
14
|
+
case ERGO_CHAIN:
|
|
15
|
+
ergoLib.Address.from_base58(address);
|
|
16
|
+
return true;
|
|
17
|
+
case CARDANO_CHAIN:
|
|
18
|
+
cardanoLib.Address.from_bech32(address);
|
|
19
|
+
return true;
|
|
20
|
+
case BITCOIN_CHAIN:
|
|
21
|
+
bitcoinLib.address.fromBech32(address);
|
|
22
|
+
if (address.slice(0, 4) != 'bc1q')
|
|
23
|
+
throw new UnsupportedAddressError(chain, address);
|
|
24
|
+
return true;
|
|
25
|
+
case ETHEREUM_CHAIN:
|
|
26
|
+
if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
|
|
27
|
+
throw new UnsupportedAddressError(chain, address);
|
|
28
|
+
return true;
|
|
29
|
+
default:
|
|
30
|
+
throw new UnsupportedChainError(chain);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxVQUFVLE1BQU0sMENBQTBDLENBQUM7QUFDdkUsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxRQUFRLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQVcsRUFBRTtJQUN6RSxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxVQUFVO1lBQ2IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNO2dCQUMvQixNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxjQUFjO1lBQ2pCLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNyRSxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2Q7WUFDRSxNQUFNLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJJVENPSU5fQ0hBSU4sXG4gIENBUkRBTk9fQ0hBSU4sXG4gIEVSR09fQ0hBSU4sXG4gIEVUSEVSRVVNX0NIQUlOLFxufSBmcm9tICcuL2NvbnN0JztcbmltcG9ydCB7IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yLCBVbnN1cHBvcnRlZENoYWluRXJyb3IgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIGVyZ29MaWIgZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0ICogYXMgY2FyZGFub0xpYiBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5MaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyBldGhlcmV1bUxpYiBmcm9tICdldGhlcnMnO1xuXG4vKipcbiAqIHZhbGlkYXRlcyBhZGRyZXNzIG9mIGEgY2hhaW5cbiAqIEBwYXJhbSBjaGFpblxuICogQHBhcmFtIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQWRkcmVzcyA9IChjaGFpbjogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChjaGFpbikge1xuICAgIGNhc2UgRVJHT19DSEFJTjpcbiAgICAgIGVyZ29MaWIuQWRkcmVzcy5mcm9tX2Jhc2U1OChhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQ0FSREFOT19DSEFJTjpcbiAgICAgIGNhcmRhbm9MaWIuQWRkcmVzcy5mcm9tX2JlY2gzMihhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQklUQ09JTl9DSEFJTjpcbiAgICAgIGJpdGNvaW5MaWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgICAgaWYgKGFkZHJlc3Muc2xpY2UoMCwgNCkgIT0gJ2JjMXEnKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBFVEhFUkVVTV9DSEFJTjpcbiAgICAgIGlmIChhZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT0gYWRkcmVzcyB8fCAhZXRoZXJldW1MaWIuaXNBZGRyZXNzKGFkZHJlc3MpKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENoYWluRXJyb3IoY2hhaW4pO1xuICB9XG59O1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAeG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
export default defineConfig({
|
|
3
|
+
test: {
|
|
4
|
+
globals: true,
|
|
5
|
+
coverage: {
|
|
6
|
+
all: true,
|
|
7
|
+
provider: 'istanbul',
|
|
8
|
+
reporter: 'cobertura',
|
|
9
|
+
},
|
|
10
|
+
passWithNoTests: true,
|
|
11
|
+
poolOptions: {
|
|
12
|
+
threads: {
|
|
13
|
+
singleThread: true,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3ZpdGVzdC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxlQUFlLFlBQVksQ0FBQztJQUMxQixJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRTtZQUNSLEdBQUcsRUFBRSxJQUFJO1lBQ1QsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLFdBQVc7U0FDdEI7UUFDRCxlQUFlLEVBQUUsSUFBSTtRQUNyQixXQUFXLEVBQUU7WUFDWCxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLElBQUk7YUFDbkI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHRlc3Q6IHtcbiAgICBnbG9iYWxzOiB0cnVlLFxuICAgIGNvdmVyYWdlOiB7XG4gICAgICBhbGw6IHRydWUsXG4gICAgICBwcm92aWRlcjogJ2lzdGFuYnVsJyxcbiAgICAgIHJlcG9ydGVyOiAnY29iZXJ0dXJhJyxcbiAgICB9LFxuICAgIHBhc3NXaXRoTm9UZXN0czogdHJ1ZSxcbiAgICBwb29sT3B0aW9uczoge1xuICAgICAgdGhyZWFkczoge1xuICAgICAgICBzaW5nbGVUaHJlYWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdfQ==
|
package/lib/const.ts
CHANGED
package/lib/decoder.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BITCOIN_CHAIN,
|
|
3
|
+
CARDANO_CHAIN,
|
|
4
|
+
ERGO_CHAIN,
|
|
5
|
+
ETHEREUM_CHAIN,
|
|
6
|
+
} from './const';
|
|
2
7
|
import { UnsupportedAddressError, UnsupportedChainError } from './types';
|
|
3
8
|
import * as ergoLib from 'ergo-lib-wasm-nodejs';
|
|
4
9
|
import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
|
|
@@ -29,6 +34,11 @@ export const decodeAddress = (
|
|
|
29
34
|
return bitcoinLib.address.fromOutputScript(
|
|
30
35
|
Buffer.from(encodedAddress, 'hex')
|
|
31
36
|
);
|
|
37
|
+
case ETHEREUM_CHAIN:
|
|
38
|
+
if (encodedAddress.length != 40) {
|
|
39
|
+
throw new UnsupportedAddressError(chain, encodedAddress);
|
|
40
|
+
}
|
|
41
|
+
return '0x' + encodedAddress;
|
|
32
42
|
default:
|
|
33
43
|
throw new UnsupportedChainError(chain);
|
|
34
44
|
}
|
package/lib/encoder.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BITCOIN_CHAIN,
|
|
3
|
+
CARDANO_CHAIN,
|
|
4
|
+
ERGO_CHAIN,
|
|
5
|
+
ETHEREUM_CHAIN,
|
|
6
|
+
} from './const';
|
|
2
7
|
import { UnsupportedAddressError, UnsupportedChainError } from './types';
|
|
3
8
|
import * as ergoLib from 'ergo-lib-wasm-nodejs';
|
|
4
9
|
import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
|
|
@@ -28,6 +33,12 @@ export const encodeAddress = (chain: string, address: string): string => {
|
|
|
28
33
|
bitcoinLib.address.toOutputScript(address)
|
|
29
34
|
).toString('hex');
|
|
30
35
|
break;
|
|
36
|
+
case ETHEREUM_CHAIN:
|
|
37
|
+
if (address.length != 42 || address.substring(0, 2) != '0x') {
|
|
38
|
+
throw new UnsupportedAddressError(chain, address);
|
|
39
|
+
}
|
|
40
|
+
encoded = address.substring(2);
|
|
41
|
+
break;
|
|
31
42
|
default:
|
|
32
43
|
throw new UnsupportedChainError(chain);
|
|
33
44
|
}
|
package/lib/index.ts
CHANGED
package/lib/validator.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BITCOIN_CHAIN,
|
|
3
|
+
CARDANO_CHAIN,
|
|
4
|
+
ERGO_CHAIN,
|
|
5
|
+
ETHEREUM_CHAIN,
|
|
6
|
+
} from './const';
|
|
7
|
+
import { UnsupportedAddressError, UnsupportedChainError } from './types';
|
|
8
|
+
import * as ergoLib from 'ergo-lib-wasm-nodejs';
|
|
9
|
+
import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
|
|
10
|
+
import * as bitcoinLib from 'bitcoinjs-lib';
|
|
11
|
+
import * as ethereumLib from 'ethers';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* validates address of a chain
|
|
15
|
+
* @param chain
|
|
16
|
+
* @param address
|
|
17
|
+
*/
|
|
18
|
+
export const validateAddress = (chain: string, address: string): boolean => {
|
|
19
|
+
switch (chain) {
|
|
20
|
+
case ERGO_CHAIN:
|
|
21
|
+
ergoLib.Address.from_base58(address);
|
|
22
|
+
return true;
|
|
23
|
+
case CARDANO_CHAIN:
|
|
24
|
+
cardanoLib.Address.from_bech32(address);
|
|
25
|
+
return true;
|
|
26
|
+
case BITCOIN_CHAIN:
|
|
27
|
+
bitcoinLib.address.fromBech32(address);
|
|
28
|
+
if (address.slice(0, 4) != 'bc1q')
|
|
29
|
+
throw new UnsupportedAddressError(chain, address);
|
|
30
|
+
return true;
|
|
31
|
+
case ETHEREUM_CHAIN:
|
|
32
|
+
if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
|
|
33
|
+
throw new UnsupportedAddressError(chain, address);
|
|
34
|
+
return true;
|
|
35
|
+
default:
|
|
36
|
+
throw new UnsupportedChainError(chain);
|
|
37
|
+
}
|
|
38
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rosen-bridge/address-codec",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1-6770eb",
|
|
4
4
|
"description": "A Typescript package for encoding and decoding of addresses in Rosen bridge supported chains",
|
|
5
5
|
"repository": "https://github.com/rosen-bridge/utils",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@emurgo/cardano-serialization-lib-nodejs": "^11.5.0",
|
|
37
37
|
"bitcoinjs-lib": "^6.1.5",
|
|
38
|
-
"ergo-lib-wasm-nodejs": "^0.
|
|
38
|
+
"ergo-lib-wasm-nodejs": "^0.24.1",
|
|
39
|
+
"ethers": "^6.13.2"
|
|
39
40
|
}
|
|
40
41
|
}
|
package/tests/decoder.spec.ts
CHANGED
|
@@ -4,7 +4,12 @@ import {
|
|
|
4
4
|
UnsupportedChainError,
|
|
5
5
|
decodeAddress,
|
|
6
6
|
} from '../lib';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
BITCOIN_CHAIN,
|
|
9
|
+
CARDANO_CHAIN,
|
|
10
|
+
ERGO_CHAIN,
|
|
11
|
+
ETHEREUM_CHAIN,
|
|
12
|
+
} from '../lib/const';
|
|
8
13
|
|
|
9
14
|
describe('decodeAddress', () => {
|
|
10
15
|
/**
|
|
@@ -49,6 +54,20 @@ describe('decodeAddress', () => {
|
|
|
49
54
|
expect(res).toEqual(testData.bitcoinAddress);
|
|
50
55
|
});
|
|
51
56
|
|
|
57
|
+
/**
|
|
58
|
+
* @target `decodeAddress` should decode Ethereum address successfully
|
|
59
|
+
* @dependencies
|
|
60
|
+
* @scenario
|
|
61
|
+
* - run test
|
|
62
|
+
* - check returned value
|
|
63
|
+
* @expected
|
|
64
|
+
* - it should be address in hex format
|
|
65
|
+
*/
|
|
66
|
+
it('should decode Ethereum address successfully', () => {
|
|
67
|
+
const res = decodeAddress(ETHEREUM_CHAIN, testData.encodedEthereumAddress);
|
|
68
|
+
expect(res).toEqual(testData.ethereumAddress);
|
|
69
|
+
});
|
|
70
|
+
|
|
52
71
|
/**
|
|
53
72
|
* @target `decodeAddress` should throw error when encoded address is more than 60 bytes
|
|
54
73
|
* @dependencies
|
package/tests/encoder.spec.ts
CHANGED
|
@@ -4,7 +4,12 @@ import {
|
|
|
4
4
|
UnsupportedChainError,
|
|
5
5
|
encodeAddress,
|
|
6
6
|
} from '../lib';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
BITCOIN_CHAIN,
|
|
9
|
+
CARDANO_CHAIN,
|
|
10
|
+
ERGO_CHAIN,
|
|
11
|
+
ETHEREUM_CHAIN,
|
|
12
|
+
} from '../lib/const';
|
|
8
13
|
|
|
9
14
|
describe('encodeAddress', () => {
|
|
10
15
|
/**
|
|
@@ -49,6 +54,35 @@ describe('encodeAddress', () => {
|
|
|
49
54
|
expect(res).toEqual(testData.encodedBitcoinAddress);
|
|
50
55
|
});
|
|
51
56
|
|
|
57
|
+
/**
|
|
58
|
+
* @target `encodeAddress` should encode Ethereum address successfully
|
|
59
|
+
* @dependencies
|
|
60
|
+
* @scenario
|
|
61
|
+
* - run test
|
|
62
|
+
* - check returned value
|
|
63
|
+
* @expected
|
|
64
|
+
* - it should be output script of given address in hex
|
|
65
|
+
*/
|
|
66
|
+
it('should encode Ethereum address successfully', () => {
|
|
67
|
+
const res = encodeAddress(ETHEREUM_CHAIN, testData.ethereumAddress);
|
|
68
|
+
expect(res).toEqual(testData.encodedEthereumAddress);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @target `encodeAddress` should throw error when address is not 40 bytes
|
|
73
|
+
* @dependencies
|
|
74
|
+
* @scenario
|
|
75
|
+
* - run test
|
|
76
|
+
* - run test & check thrown exception
|
|
77
|
+
* @expected
|
|
78
|
+
* - it should throw UnsupportedAddress error
|
|
79
|
+
*/
|
|
80
|
+
it('should encode Ethereum address successfully', () => {
|
|
81
|
+
expect(() => {
|
|
82
|
+
encodeAddress(ETHEREUM_CHAIN, testData.invalidEthereumAddressLength);
|
|
83
|
+
}).toThrow(UnsupportedAddressError);
|
|
84
|
+
});
|
|
85
|
+
|
|
52
86
|
/**
|
|
53
87
|
* @target `encodeAddress` should throw error when encoded address is more than 60 bytes
|
|
54
88
|
* @dependencies
|
package/tests/testData.ts
CHANGED
|
@@ -2,13 +2,21 @@ export const ergoAddress =
|
|
|
2
2
|
'9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVd';
|
|
3
3
|
export const encodedErgoAddress =
|
|
4
4
|
'03f999da8e6e42660e4464d17d29e63bc006734a6710a24eb489b466323d3a9339';
|
|
5
|
+
export const invalidErgoAddress =
|
|
6
|
+
'9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVD';
|
|
5
7
|
|
|
6
8
|
export const cardanoAddress =
|
|
7
9
|
'addr1qxxa3kfnnh40yqtepa5frt0tkw4a0rys7v33422lzt8glx43sqtd4vkhjzawajej8aujh27p5a54zx62xf3wvuplynqs3fsqet';
|
|
8
10
|
export const encodedCardanoAddress =
|
|
9
11
|
'018dd8d9339deaf201790f6891adebb3abd78c90f3231aa95f12ce8f9ab18016dab2d790baeecb323f792babc1a769511b4a3262e6703f24c1';
|
|
12
|
+
export const invalidCardanoAddress =
|
|
13
|
+
'addr1qxxa3kfnnh40yqtepa5frt0tkw4a0rys7v33422lzt8glx43sqtd4vkhjzawajej8aujh27p5a54zx62xf3wvuplynqs3fsqee';
|
|
10
14
|
|
|
11
15
|
export const bitcoinAddress = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6h';
|
|
16
|
+
export const invalidBitcoinAddressLength =
|
|
17
|
+
'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6';
|
|
18
|
+
export const tapRootBitcoinAddress =
|
|
19
|
+
'bc1pxhtmm7mjrafdkw46wc7lmjn3gyrmdm4q0dnmw8j225gxtwtq7mwqd7e24v';
|
|
12
20
|
export const encodedBitcoinAddress =
|
|
13
21
|
'0014b20272a6591937ba7d687dc889f3637ed40efa6a';
|
|
14
22
|
|
|
@@ -16,3 +24,11 @@ export const longErgoAddress =
|
|
|
16
24
|
'nB3L2PD3LBtiNhDYK7XhZ8nVt6uekBXN7RcPUKgdKLXFcrJiSPxmQsUKuUkTRQ1hbvDrxEQAKYurGFbaGD1RPxU7XqQimD78j23HHMQKL1boUGsnNhCxaVNAYMcFbQNo355Af8cWkhAN6';
|
|
17
25
|
export const longEncodedAddress =
|
|
18
26
|
'100304000e20a6ac381e6fa99929fd1477b3ba9499790a775e91d4c14c5aa86e9a118dfac8530400d801d601b2db6501fe730000ea02d1aedb63087201d901024d0e938c720201730198b2e4c672010510730200ade4c67201041ad901020ecdee7202';
|
|
27
|
+
|
|
28
|
+
export const ethereumAddress = '0xb416c8a6d7ec94706a9ae2c26c11d320519482b1';
|
|
29
|
+
export const encodedEthereumAddress =
|
|
30
|
+
'b416c8a6d7ec94706a9ae2c26c11d320519482b1';
|
|
31
|
+
|
|
32
|
+
export const invalidEthereumAddressLength =
|
|
33
|
+
'0xb416c8a7ec94706a9ae2c26c11d320519482b1';
|
|
34
|
+
export const invalidEthereumIcapAddress = 'XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36';
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as testData from './testData';
|
|
2
|
+
import {
|
|
3
|
+
UnsupportedAddressError,
|
|
4
|
+
UnsupportedChainError,
|
|
5
|
+
validateAddress,
|
|
6
|
+
} from '../lib';
|
|
7
|
+
import {
|
|
8
|
+
BITCOIN_CHAIN,
|
|
9
|
+
CARDANO_CHAIN,
|
|
10
|
+
ERGO_CHAIN,
|
|
11
|
+
ETHEREUM_CHAIN,
|
|
12
|
+
} from '../lib/const';
|
|
13
|
+
|
|
14
|
+
describe('validateAddress', () => {
|
|
15
|
+
/**
|
|
16
|
+
* @target `validateAddress` should validate Ergo address successfully
|
|
17
|
+
* @dependencies
|
|
18
|
+
* @scenario
|
|
19
|
+
* - run test
|
|
20
|
+
* @expected
|
|
21
|
+
* - to validate correct Ergo address
|
|
22
|
+
*/
|
|
23
|
+
it('should validate Ergo address successfully', () => {
|
|
24
|
+
const res = validateAddress(ERGO_CHAIN, testData.ergoAddress);
|
|
25
|
+
expect(res).toEqual(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @target `validateAddress` should not validate wrong Ergo address
|
|
30
|
+
* @dependencies
|
|
31
|
+
* @scenario
|
|
32
|
+
* - run test
|
|
33
|
+
* @expected
|
|
34
|
+
* - not to validate wrong Ergo address
|
|
35
|
+
*/
|
|
36
|
+
it('should not validate wrong Ergo address', () => {
|
|
37
|
+
expect(() => {
|
|
38
|
+
validateAddress(ERGO_CHAIN, testData.invalidErgoAddress);
|
|
39
|
+
}).toThrow();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @target `validateAddress` should validate Cardano address successfully
|
|
44
|
+
* @dependencies
|
|
45
|
+
* @scenario
|
|
46
|
+
* - run test
|
|
47
|
+
* @expected
|
|
48
|
+
* - to validate correct Cardano address
|
|
49
|
+
*/
|
|
50
|
+
it('should validate Cardano address successfully', () => {
|
|
51
|
+
const res = validateAddress(CARDANO_CHAIN, testData.cardanoAddress);
|
|
52
|
+
expect(res).toEqual(true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @target `validateAddress` should not validate wrong Cardano address
|
|
57
|
+
* @dependencies
|
|
58
|
+
* @scenario
|
|
59
|
+
* - run test
|
|
60
|
+
* @expected
|
|
61
|
+
* - not to validate wrong Cardano address
|
|
62
|
+
*/
|
|
63
|
+
it('should not validate wrong Cardano address', () => {
|
|
64
|
+
expect(() => {
|
|
65
|
+
validateAddress(CARDANO_CHAIN, testData.invalidCardanoAddress);
|
|
66
|
+
}).toThrow();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @target `validateAddress` should validate Bitcoin address successfully
|
|
71
|
+
* @dependencies
|
|
72
|
+
* @scenario
|
|
73
|
+
* - run test
|
|
74
|
+
* @expected
|
|
75
|
+
* - to validate correct Bitcoin address
|
|
76
|
+
*/
|
|
77
|
+
it('should validate Bitcoin address successfully', () => {
|
|
78
|
+
const res = validateAddress(BITCOIN_CHAIN, testData.bitcoinAddress);
|
|
79
|
+
expect(res).toEqual(true);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @target `validateAddress` should not validate Bitcoin taproot address
|
|
84
|
+
* @dependencies
|
|
85
|
+
* @scenario
|
|
86
|
+
* - run test
|
|
87
|
+
* @expected
|
|
88
|
+
* - not to validate Bitcoin taproot address
|
|
89
|
+
*/
|
|
90
|
+
it('should not validate Bitcoin taproot address', () => {
|
|
91
|
+
expect(() => {
|
|
92
|
+
validateAddress(BITCOIN_CHAIN, testData.tapRootBitcoinAddress);
|
|
93
|
+
}).toThrow(UnsupportedAddressError);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @target `validateAddress` should not validate wrong Bitcoin address
|
|
98
|
+
* @dependencies
|
|
99
|
+
* @scenario
|
|
100
|
+
* - run test
|
|
101
|
+
* @expected
|
|
102
|
+
* - not to validate wrong Bitcoin address
|
|
103
|
+
*/
|
|
104
|
+
it('should not validate wrong Bitcoin address', () => {
|
|
105
|
+
expect(() => {
|
|
106
|
+
validateAddress(BITCOIN_CHAIN, testData.invalidBitcoinAddressLength);
|
|
107
|
+
}).toThrowError();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @target `validateAddress` should validate Ethereum address successfully
|
|
112
|
+
* @dependencies
|
|
113
|
+
* @scenario
|
|
114
|
+
* - run test
|
|
115
|
+
* @expected
|
|
116
|
+
* - to validate correct Ethereum address
|
|
117
|
+
*/
|
|
118
|
+
it('should validate Ethereum address successfully', () => {
|
|
119
|
+
const res = validateAddress(ETHEREUM_CHAIN, testData.ethereumAddress);
|
|
120
|
+
expect(res).toEqual(true);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @target `validateAddress` should not validate ICAP Ethereum address
|
|
125
|
+
* @dependencies
|
|
126
|
+
* @scenario
|
|
127
|
+
* - run test
|
|
128
|
+
* @expected
|
|
129
|
+
* - not to validate ICAP Ethereum address
|
|
130
|
+
*/
|
|
131
|
+
it('should not validate ICAP Ethereum address', () => {
|
|
132
|
+
expect(() => {
|
|
133
|
+
validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumIcapAddress);
|
|
134
|
+
}).toThrow(UnsupportedAddressError);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* @target `validateAddress` should not validate wrong Ethereum address
|
|
139
|
+
* @dependencies
|
|
140
|
+
* @scenario
|
|
141
|
+
* - run test
|
|
142
|
+
* @expected
|
|
143
|
+
* - not to validate wrong Ethereum address
|
|
144
|
+
*/
|
|
145
|
+
it('should not validate wrong Ethereum address', () => {
|
|
146
|
+
expect(() => {
|
|
147
|
+
validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumAddressLength);
|
|
148
|
+
}).toThrow(UnsupportedAddressError);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @target `validateAddress` should throw error when chain is not supported
|
|
153
|
+
* @dependencies
|
|
154
|
+
* @scenario
|
|
155
|
+
* - run test
|
|
156
|
+
* @expected
|
|
157
|
+
* - it should throw UnsupportedChain error
|
|
158
|
+
*/
|
|
159
|
+
it('should throw error when chain is not supported', () => {
|
|
160
|
+
expect(() => {
|
|
161
|
+
validateAddress('unsupported-chain', '0011223344');
|
|
162
|
+
}).toThrow(UnsupportedChainError);
|
|
163
|
+
});
|
|
164
|
+
});
|