@hyperlane-xyz/utils 3.9.0 → 3.11.0-beta-0
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 +20 -0
- package/dist/{src/addresses.d.ts → addresses.d.ts} +1 -1
- package/dist/addresses.d.ts.map +1 -0
- package/dist/addresses.js +292 -0
- package/dist/addresses.js.map +1 -0
- package/dist/{src/addresses.test.d.ts.map → addresses.test.d.ts.map} +1 -1
- package/dist/addresses.test.js +44 -0
- package/dist/addresses.test.js.map +1 -0
- package/dist/{src/amount.d.ts → amount.d.ts} +1 -1
- package/dist/amount.d.ts.map +1 -0
- package/dist/{src/amount.js → amount.js} +24 -36
- package/dist/amount.js.map +1 -0
- package/dist/{src/amount.test.d.ts.map → amount.test.d.ts.map} +1 -1
- package/dist/amount.test.js +46 -0
- package/dist/amount.test.js.map +1 -0
- package/dist/arrays.d.ts.map +1 -0
- package/dist/arrays.js +11 -0
- package/dist/arrays.js.map +1 -0
- package/dist/async.d.ts.map +1 -0
- package/dist/{src/async.js → async.js} +6 -15
- package/dist/async.js.map +1 -0
- package/dist/{src/base58.d.ts → base58.d.ts} +1 -1
- package/dist/base58.d.ts.map +1 -0
- package/dist/base58.js +15 -0
- package/dist/base58.js.map +1 -0
- package/dist/base64.d.ts.map +1 -0
- package/dist/base64.js +25 -0
- package/dist/base64.js.map +1 -0
- package/dist/{src/big-numbers.d.ts → big-numbers.d.ts} +1 -1
- package/dist/big-numbers.d.ts.map +1 -0
- package/dist/{src/big-numbers.js → big-numbers.js} +16 -29
- package/dist/big-numbers.js.map +1 -0
- package/dist/big-numbers.test.d.ts.map +1 -0
- package/dist/{src/big-numbers.test.js → big-numbers.test.js} +29 -34
- package/dist/big-numbers.test.js.map +1 -0
- package/dist/calldata.d.ts.map +1 -0
- package/dist/calldata.js +4 -0
- package/dist/calldata.js.map +1 -0
- package/dist/{src/checkpoints.d.ts → checkpoints.d.ts} +1 -1
- package/dist/checkpoints.d.ts.map +1 -0
- package/dist/checkpoints.js +24 -0
- package/dist/checkpoints.js.map +1 -0
- package/dist/domains.d.ts.map +1 -0
- package/dist/domains.js +6 -0
- package/dist/domains.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +11 -0
- package/dist/env.js.map +1 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/{src/ids.js → ids.js} +8 -13
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +23 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -142
- package/dist/index.js.map +1 -1
- package/dist/logging.d.ts +20 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +80 -0
- package/dist/logging.js.map +1 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/{src/math.js → math.js} +4 -11
- package/dist/math.js.map +1 -0
- package/dist/{src/messages.d.ts → messages.d.ts} +1 -1
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +52 -0
- package/dist/messages.js.map +1 -0
- package/dist/{src/multisig.d.ts → multisig.d.ts} +1 -1
- package/dist/multisig.d.ts.map +1 -0
- package/dist/multisig.js +53 -0
- package/dist/multisig.js.map +1 -0
- package/dist/objects.d.ts.map +1 -0
- package/dist/{src/objects.js → objects.js} +12 -27
- package/dist/objects.js.map +1 -0
- package/dist/sets.d.ts.map +1 -0
- package/dist/{src/sets.js → sets.js} +3 -9
- package/dist/sets.js.map +1 -0
- package/dist/{src/strings.d.ts → strings.d.ts} +1 -1
- package/dist/strings.d.ts.map +1 -0
- package/dist/{src/strings.js → strings.js} +5 -13
- package/dist/strings.js.map +1 -0
- package/dist/typeof.d.ts.map +1 -0
- package/dist/typeof.js +7 -0
- package/dist/typeof.js.map +1 -0
- package/dist/{src/types.d.ts → types.d.ts} +2 -1
- package/dist/types.d.ts.map +1 -0
- package/dist/{src/types.js → types.js} +7 -10
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +6 -0
- package/dist/validation.js.map +1 -0
- package/dist/{src/validator.d.ts → validator.d.ts} +1 -1
- package/dist/validator.d.ts.map +1 -0
- package/dist/{src/validator.js → validator.js} +11 -12
- package/dist/validator.js.map +1 -0
- package/package.json +13 -8
- package/dist/src/addresses.d.ts.map +0 -1
- package/dist/src/addresses.js +0 -335
- package/dist/src/addresses.js.map +0 -1
- package/dist/src/addresses.test.js +0 -46
- package/dist/src/addresses.test.js.map +0 -1
- package/dist/src/amount.d.ts.map +0 -1
- package/dist/src/amount.js.map +0 -1
- package/dist/src/amount.test.js +0 -48
- package/dist/src/amount.test.js.map +0 -1
- package/dist/src/arrays.d.ts.map +0 -1
- package/dist/src/arrays.js +0 -16
- package/dist/src/arrays.js.map +0 -1
- package/dist/src/async.d.ts.map +0 -1
- package/dist/src/async.js.map +0 -1
- package/dist/src/base58.d.ts.map +0 -1
- package/dist/src/base58.js +0 -21
- package/dist/src/base58.js.map +0 -1
- package/dist/src/base64.d.ts.map +0 -1
- package/dist/src/base64.js +0 -30
- package/dist/src/base64.js.map +0 -1
- package/dist/src/big-numbers.d.ts.map +0 -1
- package/dist/src/big-numbers.js.map +0 -1
- package/dist/src/big-numbers.test.d.ts.map +0 -1
- package/dist/src/big-numbers.test.js.map +0 -1
- package/dist/src/calldata.d.ts.map +0 -1
- package/dist/src/calldata.js +0 -8
- package/dist/src/calldata.js.map +0 -1
- package/dist/src/checkpoints.d.ts.map +0 -1
- package/dist/src/checkpoints.js +0 -30
- package/dist/src/checkpoints.js.map +0 -1
- package/dist/src/domains.d.ts.map +0 -1
- package/dist/src/domains.js +0 -10
- package/dist/src/domains.js.map +0 -1
- package/dist/src/env.d.ts +0 -2
- package/dist/src/env.d.ts.map +0 -1
- package/dist/src/env.js +0 -15
- package/dist/src/env.js.map +0 -1
- package/dist/src/ids.d.ts.map +0 -1
- package/dist/src/ids.js.map +0 -1
- package/dist/src/logging.d.ts +0 -6
- package/dist/src/logging.d.ts.map +0 -1
- package/dist/src/logging.js +0 -44
- package/dist/src/logging.js.map +0 -1
- package/dist/src/math.d.ts.map +0 -1
- package/dist/src/math.js.map +0 -1
- package/dist/src/messages.d.ts.map +0 -1
- package/dist/src/messages.js +0 -58
- package/dist/src/messages.js.map +0 -1
- package/dist/src/multisig.d.ts.map +0 -1
- package/dist/src/multisig.js +0 -61
- package/dist/src/multisig.js.map +0 -1
- package/dist/src/objects.d.ts.map +0 -1
- package/dist/src/objects.js.map +0 -1
- package/dist/src/sets.d.ts.map +0 -1
- package/dist/src/sets.js.map +0 -1
- package/dist/src/strings.d.ts.map +0 -1
- package/dist/src/strings.js.map +0 -1
- package/dist/src/typeof.d.ts.map +0 -1
- package/dist/src/typeof.js +0 -12
- package/dist/src/typeof.js.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js.map +0 -1
- package/dist/src/validation.d.ts.map +0 -1
- package/dist/src/validation.js +0 -10
- package/dist/src/validation.js.map +0 -1
- package/dist/src/validator.d.ts.map +0 -1
- package/dist/src/validator.js.map +0 -1
- /package/dist/{src/addresses.test.d.ts → addresses.test.d.ts} +0 -0
- /package/dist/{src/amount.test.d.ts → amount.test.d.ts} +0 -0
- /package/dist/{src/arrays.d.ts → arrays.d.ts} +0 -0
- /package/dist/{src/async.d.ts → async.d.ts} +0 -0
- /package/dist/{src/base64.d.ts → base64.d.ts} +0 -0
- /package/dist/{src/big-numbers.test.d.ts → big-numbers.test.d.ts} +0 -0
- /package/dist/{src/calldata.d.ts → calldata.d.ts} +0 -0
- /package/dist/{src/domains.d.ts → domains.d.ts} +0 -0
- /package/dist/{src/ids.d.ts → ids.d.ts} +0 -0
- /package/dist/{src/math.d.ts → math.d.ts} +0 -0
- /package/dist/{src/objects.d.ts → objects.d.ts} +0 -0
- /package/dist/{src/sets.d.ts → sets.d.ts} +0 -0
- /package/dist/{src/typeof.d.ts → typeof.d.ts} +0 -0
- /package/dist/{src/validation.d.ts → validation.d.ts} +0 -0
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Hyperlane Utils
|
|
2
|
+
|
|
3
|
+
A collection of various utilities and types for building applications with Hyperlane.
|
|
4
|
+
Typically not used directly but through the [Hyperlane SDK](https://www.npmjs.com/package/@hyperlane-xyz/sdk) instead.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Install with NPM
|
|
10
|
+
npm install @hyperlane-xyz/utils
|
|
11
|
+
|
|
12
|
+
# Or with Yarn
|
|
13
|
+
yarn add @hyperlane-xyz/utils
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Note, this package uses [ESM Modules](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#pure-esm-package)
|
|
17
|
+
|
|
18
|
+
## License
|
|
19
|
+
|
|
20
|
+
Apache 2.0
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Address, HexString, ProtocolType } from './types';
|
|
1
|
+
import { Address, HexString, ProtocolType } from './types.js';
|
|
2
2
|
export declare function isAddressEvm(address: Address): boolean;
|
|
3
3
|
export declare function isAddressSealevel(address: Address): boolean;
|
|
4
4
|
export declare function isAddressCosmos(address: Address): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../src/addresses.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0B9D,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,WAE5C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,WAEjD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,WAM/C;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,mFAWtD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,WAEzC;AAeD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,WAQjD;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,WAOtD;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,WAWpD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,WAWvE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,UAOnD;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,UAOxD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,UAOtD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,UAWzE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,WAEpD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,WAEpD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,WAEvD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,WAcjD;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,WAEtD;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,WAE3D;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,WAEzD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,WAU3E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,WAMhD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,UASpE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,UAIjD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAI5D;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAG9D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAEjE;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,YAAY,GACtB,UAAU,CAgBZ;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,YAAY,UAKxB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,YAAY,GACtB,MAAM,CAOR;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CASxD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE5D;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAGT;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,YAAY,EACxB,MAAM,CAAC,EAAE,MAAM,UAehB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,YAAY,EACtB,MAAM,CAAC,EAAE,MAAM,UAQhB;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,UAEtC;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,UAErC"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { fromBech32, normalizeBech32, toBech32 } from '@cosmjs/encoding';
|
|
2
|
+
import { PublicKey } from '@solana/web3.js';
|
|
3
|
+
import { utils as ethersUtils } from 'ethers';
|
|
4
|
+
import { isNullish } from './typeof.js';
|
|
5
|
+
import { ProtocolType } from './types.js';
|
|
6
|
+
import { assert } from './validation.js';
|
|
7
|
+
const EVM_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/;
|
|
8
|
+
const SEALEVEL_ADDRESS_REGEX = /^[a-zA-Z0-9]{36,44}$/;
|
|
9
|
+
const HEX_BYTES32_REGEX = /^0x[a-fA-F0-9]{64}$/;
|
|
10
|
+
// https://github.com/cosmos/cosmos-sdk/blob/84c33215658131d87daf3c629e909e12ed9370fa/types/coin.go#L601C17-L601C44
|
|
11
|
+
const COSMOS_DENOM_PATTERN = `[a-zA-Z][a-zA-Z0-9]{2,127}`;
|
|
12
|
+
// https://en.bitcoin.it/wiki/BIP_0173
|
|
13
|
+
const BECH32_ADDRESS_PATTERN = `[a-zA-Z]{1,83}1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38,58}`;
|
|
14
|
+
const COSMOS_ADDRESS_REGEX = new RegExp(`^${BECH32_ADDRESS_PATTERN}$`);
|
|
15
|
+
const IBC_DENOM_REGEX = new RegExp(`^ibc/([A-Fa-f0-9]{64})$`);
|
|
16
|
+
const COSMOS_FACTORY_TOKEN_REGEX = new RegExp(`^factory/(${BECH32_ADDRESS_PATTERN})/${COSMOS_DENOM_PATTERN}$`);
|
|
17
|
+
const EVM_TX_HASH_REGEX = /^0x([A-Fa-f0-9]{64})$/;
|
|
18
|
+
const SEALEVEL_TX_HASH_REGEX = /^[a-zA-Z1-9]{88}$/;
|
|
19
|
+
const COSMOS_TX_HASH_REGEX = /^(0x)?[A-Fa-f0-9]{64}$/;
|
|
20
|
+
const EVM_ZEROISH_ADDRESS_REGEX = /^(0x)?0*$/;
|
|
21
|
+
const SEALEVEL_ZEROISH_ADDRESS_REGEX = /^1+$/;
|
|
22
|
+
const COSMOS_ZEROISH_ADDRESS_REGEX = /^[a-z]{1,10}?1[0]+$/;
|
|
23
|
+
export function isAddressEvm(address) {
|
|
24
|
+
return EVM_ADDRESS_REGEX.test(address);
|
|
25
|
+
}
|
|
26
|
+
export function isAddressSealevel(address) {
|
|
27
|
+
return SEALEVEL_ADDRESS_REGEX.test(address);
|
|
28
|
+
}
|
|
29
|
+
export function isAddressCosmos(address) {
|
|
30
|
+
return (COSMOS_ADDRESS_REGEX.test(address) ||
|
|
31
|
+
IBC_DENOM_REGEX.test(address) ||
|
|
32
|
+
COSMOS_FACTORY_TOKEN_REGEX.test(address));
|
|
33
|
+
}
|
|
34
|
+
export function getAddressProtocolType(address) {
|
|
35
|
+
if (!address)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (isAddressEvm(address)) {
|
|
38
|
+
return ProtocolType.Ethereum;
|
|
39
|
+
}
|
|
40
|
+
else if (isAddressCosmos(address)) {
|
|
41
|
+
return ProtocolType.Cosmos;
|
|
42
|
+
}
|
|
43
|
+
else if (isAddressSealevel(address)) {
|
|
44
|
+
return ProtocolType.Sealevel;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function isAddress(address) {
|
|
51
|
+
return !!getAddressProtocolType(address);
|
|
52
|
+
}
|
|
53
|
+
function routeAddressUtil(fns, param, fallback, protocol) {
|
|
54
|
+
protocol ||= getAddressProtocolType(param);
|
|
55
|
+
if (protocol && fns[protocol])
|
|
56
|
+
return fns[protocol](param);
|
|
57
|
+
else if (!isNullish(fallback))
|
|
58
|
+
return fallback;
|
|
59
|
+
else
|
|
60
|
+
throw new Error(`Unsupported protocol ${protocol}`);
|
|
61
|
+
}
|
|
62
|
+
// Slower than isAddressEvm above but actually validates content and checksum
|
|
63
|
+
export function isValidAddressEvm(address) {
|
|
64
|
+
// Need to catch because ethers' isAddress throws in some cases (bad checksum)
|
|
65
|
+
try {
|
|
66
|
+
const isValid = address && ethersUtils.isAddress(address);
|
|
67
|
+
return !!isValid;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Slower than isAddressSealevel above but actually validates content and checksum
|
|
74
|
+
export function isValidAddressSealevel(address) {
|
|
75
|
+
try {
|
|
76
|
+
const isValid = address && new PublicKey(address).toBase58();
|
|
77
|
+
return !!isValid;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Slower than isAddressCosmos above but actually validates content and checksum
|
|
84
|
+
export function isValidAddressCosmos(address) {
|
|
85
|
+
try {
|
|
86
|
+
const isValid = address &&
|
|
87
|
+
(IBC_DENOM_REGEX.test(address) ||
|
|
88
|
+
COSMOS_FACTORY_TOKEN_REGEX.test(address) ||
|
|
89
|
+
fromBech32(address));
|
|
90
|
+
return !!isValid;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function isValidAddress(address, protocol) {
|
|
97
|
+
return routeAddressUtil({
|
|
98
|
+
[ProtocolType.Ethereum]: isValidAddressEvm,
|
|
99
|
+
[ProtocolType.Sealevel]: isValidAddressSealevel,
|
|
100
|
+
[ProtocolType.Cosmos]: isValidAddressCosmos,
|
|
101
|
+
}, address, false, protocol);
|
|
102
|
+
}
|
|
103
|
+
export function normalizeAddressEvm(address) {
|
|
104
|
+
if (isZeroishAddress(address))
|
|
105
|
+
return address;
|
|
106
|
+
try {
|
|
107
|
+
return ethersUtils.getAddress(address);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return address;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function normalizeAddressSealevel(address) {
|
|
114
|
+
if (isZeroishAddress(address))
|
|
115
|
+
return address;
|
|
116
|
+
try {
|
|
117
|
+
return new PublicKey(address).toBase58();
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return address;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function normalizeAddressCosmos(address) {
|
|
124
|
+
if (isZeroishAddress(address))
|
|
125
|
+
return address;
|
|
126
|
+
try {
|
|
127
|
+
return normalizeBech32(address);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return address;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function normalizeAddress(address, protocol) {
|
|
134
|
+
return routeAddressUtil({
|
|
135
|
+
[ProtocolType.Ethereum]: normalizeAddressEvm,
|
|
136
|
+
[ProtocolType.Sealevel]: normalizeAddressSealevel,
|
|
137
|
+
[ProtocolType.Cosmos]: normalizeAddressCosmos,
|
|
138
|
+
}, address, address, protocol);
|
|
139
|
+
}
|
|
140
|
+
export function eqAddressEvm(a1, a2) {
|
|
141
|
+
return normalizeAddressEvm(a1) === normalizeAddressEvm(a2);
|
|
142
|
+
}
|
|
143
|
+
export function eqAddressSol(a1, a2) {
|
|
144
|
+
return normalizeAddressSealevel(a1) === normalizeAddressSealevel(a2);
|
|
145
|
+
}
|
|
146
|
+
export function eqAddressCosmos(a1, a2) {
|
|
147
|
+
return normalizeAddressCosmos(a1) === normalizeAddressCosmos(a2);
|
|
148
|
+
}
|
|
149
|
+
export function eqAddress(a1, a2) {
|
|
150
|
+
const p1 = getAddressProtocolType(a1);
|
|
151
|
+
const p2 = getAddressProtocolType(a2);
|
|
152
|
+
if (p1 !== p2)
|
|
153
|
+
return false;
|
|
154
|
+
return routeAddressUtil({
|
|
155
|
+
[ProtocolType.Ethereum]: (_a1) => eqAddressEvm(_a1, a2),
|
|
156
|
+
[ProtocolType.Sealevel]: (_a1) => eqAddressSol(_a1, a2),
|
|
157
|
+
[ProtocolType.Cosmos]: (_a1) => eqAddressCosmos(_a1, a2),
|
|
158
|
+
}, a1, false, p1);
|
|
159
|
+
}
|
|
160
|
+
export function isValidTransactionHashEvm(input) {
|
|
161
|
+
return EVM_TX_HASH_REGEX.test(input);
|
|
162
|
+
}
|
|
163
|
+
export function isValidTransactionHashSealevel(input) {
|
|
164
|
+
return SEALEVEL_TX_HASH_REGEX.test(input);
|
|
165
|
+
}
|
|
166
|
+
export function isValidTransactionHashCosmos(input) {
|
|
167
|
+
return COSMOS_TX_HASH_REGEX.test(input);
|
|
168
|
+
}
|
|
169
|
+
export function isValidTransactionHash(input, protocol) {
|
|
170
|
+
if (protocol === ProtocolType.Ethereum) {
|
|
171
|
+
return isValidTransactionHashEvm(input);
|
|
172
|
+
}
|
|
173
|
+
else if (protocol === ProtocolType.Sealevel) {
|
|
174
|
+
return isValidTransactionHashSealevel(input);
|
|
175
|
+
}
|
|
176
|
+
else if (protocol === ProtocolType.Cosmos) {
|
|
177
|
+
return isValidTransactionHashCosmos(input);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
export function isZeroishAddress(address) {
|
|
184
|
+
return (EVM_ZEROISH_ADDRESS_REGEX.test(address) ||
|
|
185
|
+
SEALEVEL_ZEROISH_ADDRESS_REGEX.test(address) ||
|
|
186
|
+
COSMOS_ZEROISH_ADDRESS_REGEX.test(address));
|
|
187
|
+
}
|
|
188
|
+
export function shortenAddress(address, capitalize) {
|
|
189
|
+
if (!address)
|
|
190
|
+
return '';
|
|
191
|
+
if (address.length < 8)
|
|
192
|
+
return address;
|
|
193
|
+
const normalized = normalizeAddress(address);
|
|
194
|
+
const shortened = normalized.substring(0, 5) +
|
|
195
|
+
'...' +
|
|
196
|
+
normalized.substring(normalized.length - 4);
|
|
197
|
+
return capitalize ? capitalizeAddress(shortened) : shortened;
|
|
198
|
+
}
|
|
199
|
+
export function capitalizeAddress(address) {
|
|
200
|
+
if (address.startsWith('0x'))
|
|
201
|
+
return '0x' + address.substring(2).toUpperCase();
|
|
202
|
+
else
|
|
203
|
+
return address.toUpperCase();
|
|
204
|
+
}
|
|
205
|
+
export function addressToBytes32Evm(address) {
|
|
206
|
+
return ethersUtils
|
|
207
|
+
.hexZeroPad(ethersUtils.hexStripZeros(address), 32)
|
|
208
|
+
.toLowerCase();
|
|
209
|
+
}
|
|
210
|
+
// For EVM addresses only, kept for backwards compatibility and convenience
|
|
211
|
+
export function bytes32ToAddress(bytes32) {
|
|
212
|
+
return ethersUtils.getAddress(bytes32.slice(-40));
|
|
213
|
+
}
|
|
214
|
+
export function addressToBytesEvm(address) {
|
|
215
|
+
const addrBytes32 = addressToBytes32Evm(address);
|
|
216
|
+
return Buffer.from(strip0x(addrBytes32), 'hex');
|
|
217
|
+
}
|
|
218
|
+
export function addressToBytesSol(address) {
|
|
219
|
+
return new PublicKey(address).toBytes();
|
|
220
|
+
}
|
|
221
|
+
export function addressToBytesCosmos(address) {
|
|
222
|
+
return fromBech32(address).data;
|
|
223
|
+
}
|
|
224
|
+
export function addressToBytes(address, protocol) {
|
|
225
|
+
const bytes = routeAddressUtil({
|
|
226
|
+
[ProtocolType.Ethereum]: addressToBytesEvm,
|
|
227
|
+
[ProtocolType.Sealevel]: addressToBytesSol,
|
|
228
|
+
[ProtocolType.Cosmos]: addressToBytesCosmos,
|
|
229
|
+
}, address, new Uint8Array(), protocol);
|
|
230
|
+
assert(bytes.length && !bytes.every((b) => b == 0), 'address bytes must not be empty');
|
|
231
|
+
return bytes;
|
|
232
|
+
}
|
|
233
|
+
export function addressToByteHexString(address, protocol) {
|
|
234
|
+
return ensure0x(Buffer.from(addressToBytes(address, protocol)).toString('hex'));
|
|
235
|
+
}
|
|
236
|
+
export function addressToBytes32(address, protocol) {
|
|
237
|
+
// If the address is already bytes32, just return, avoiding a regression
|
|
238
|
+
// where an already bytes32 address cannot be categorized as a protocol address.
|
|
239
|
+
if (HEX_BYTES32_REGEX.test(ensure0x(address)))
|
|
240
|
+
return ensure0x(address);
|
|
241
|
+
const bytes = addressToBytes(address, protocol);
|
|
242
|
+
return bytesToBytes32(bytes);
|
|
243
|
+
}
|
|
244
|
+
export function bytesToBytes32(bytes) {
|
|
245
|
+
if (bytes.length > 32) {
|
|
246
|
+
throw new Error('bytes must be 32 bytes or less');
|
|
247
|
+
}
|
|
248
|
+
// This 0x-prefixes the hex string
|
|
249
|
+
return ethersUtils.hexZeroPad(ensure0x(Buffer.from(bytes).toString('hex')), 32);
|
|
250
|
+
}
|
|
251
|
+
export function bytesToAddressEvm(bytes) {
|
|
252
|
+
return bytes32ToAddress(Buffer.from(bytes).toString('hex'));
|
|
253
|
+
}
|
|
254
|
+
export function bytesToAddressSol(bytes) {
|
|
255
|
+
return new PublicKey(bytes).toBase58();
|
|
256
|
+
}
|
|
257
|
+
export function bytesToAddressCosmos(bytes, prefix) {
|
|
258
|
+
if (!prefix)
|
|
259
|
+
throw new Error('Prefix required for Cosmos address');
|
|
260
|
+
return toBech32(prefix, bytes);
|
|
261
|
+
}
|
|
262
|
+
export function bytesToProtocolAddress(bytes, toProtocol, prefix) {
|
|
263
|
+
assert(bytes.length && !bytes.every((b) => b == 0), 'address bytes must not be empty');
|
|
264
|
+
if (toProtocol === ProtocolType.Ethereum) {
|
|
265
|
+
return bytesToAddressEvm(bytes);
|
|
266
|
+
}
|
|
267
|
+
else if (toProtocol === ProtocolType.Sealevel) {
|
|
268
|
+
return bytesToAddressSol(bytes);
|
|
269
|
+
}
|
|
270
|
+
else if (toProtocol === ProtocolType.Cosmos) {
|
|
271
|
+
return bytesToAddressCosmos(bytes, prefix);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
throw new Error(`Unsupported protocol for address ${toProtocol}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
export function convertToProtocolAddress(address, protocol, prefix) {
|
|
278
|
+
const currentProtocol = getAddressProtocolType(address);
|
|
279
|
+
if (!currentProtocol)
|
|
280
|
+
throw new Error(`Unknown address protocol for ${address}`);
|
|
281
|
+
if (currentProtocol === protocol)
|
|
282
|
+
return address;
|
|
283
|
+
const addressBytes = addressToBytes(address, currentProtocol);
|
|
284
|
+
return bytesToProtocolAddress(addressBytes, protocol, prefix);
|
|
285
|
+
}
|
|
286
|
+
export function ensure0x(hexstr) {
|
|
287
|
+
return hexstr.startsWith('0x') ? hexstr : `0x${hexstr}`;
|
|
288
|
+
}
|
|
289
|
+
export function strip0x(hexstr) {
|
|
290
|
+
return hexstr.startsWith('0x') ? hexstr.slice(2) : hexstr;
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=addresses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../src/addresses.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addresses.test.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"addresses.test.d.ts","sourceRoot":"","sources":["../src/addresses.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { addressToBytes, bytesToProtocolAddress, isZeroishAddress, } from './addresses.js';
|
|
3
|
+
import { ProtocolType } from './types.js';
|
|
4
|
+
const ETH_ZERO_ADDR = '0x0000000000000000000000000000000000000000';
|
|
5
|
+
const ETH_NON_ZERO_ADDR = '0x0000000000000000000000000000000000000001';
|
|
6
|
+
const COS_ZERO_ADDR = 'cosmos1000';
|
|
7
|
+
const COS_NON_ZERO_ADDR = 'neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq';
|
|
8
|
+
const SOL_ZERO_ADDR = '111111';
|
|
9
|
+
const SOL_NON_ZERO_ADDR = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
|
|
10
|
+
// TODO increase address utility test coverage
|
|
11
|
+
describe('Address utilities', () => {
|
|
12
|
+
describe('isZeroishAddress', () => {
|
|
13
|
+
it('Identifies 0-ish addresses', () => {
|
|
14
|
+
expect(isZeroishAddress('0x')).to.be.true;
|
|
15
|
+
expect(isZeroishAddress(ETH_ZERO_ADDR)).to.be.true;
|
|
16
|
+
expect(isZeroishAddress(COS_ZERO_ADDR)).to.be.true;
|
|
17
|
+
expect(isZeroishAddress(SOL_ZERO_ADDR)).to.be.true;
|
|
18
|
+
});
|
|
19
|
+
it('Identifies non-0-ish addresses', () => {
|
|
20
|
+
expect(isZeroishAddress(ETH_NON_ZERO_ADDR)).to.be.false;
|
|
21
|
+
expect(isZeroishAddress(COS_NON_ZERO_ADDR)).to.be.false;
|
|
22
|
+
expect(isZeroishAddress(SOL_NON_ZERO_ADDR)).to.be.false;
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('addressToBytes', () => {
|
|
26
|
+
it('Converts addresses to bytes', () => {
|
|
27
|
+
expect(addressToBytes(ETH_NON_ZERO_ADDR).length).to.equal(32);
|
|
28
|
+
});
|
|
29
|
+
it('Rejects zeroish addresses', () => {
|
|
30
|
+
expect(() => addressToBytes(ETH_ZERO_ADDR)).to.throw(Error);
|
|
31
|
+
expect(() => addressToBytes(COS_ZERO_ADDR)).to.throw(Error);
|
|
32
|
+
expect(() => addressToBytes(SOL_ZERO_ADDR)).to.throw(Error);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('bytesToProtocolAddress', () => {
|
|
36
|
+
it('Converts bytes to address', () => {
|
|
37
|
+
expect(bytesToProtocolAddress(addressToBytes(ETH_NON_ZERO_ADDR), ProtocolType.Ethereum)).to.equal(ETH_NON_ZERO_ADDR);
|
|
38
|
+
});
|
|
39
|
+
it('Rejects zeroish addresses', () => {
|
|
40
|
+
expect(() => bytesToProtocolAddress(new Uint8Array([0, 0, 0]), ProtocolType.Ethereum)).to.throw(Error);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=addresses.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.test.js","sourceRoot":"","sources":["../src/addresses.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount.d.ts","sourceRoot":"","sources":["../src/amount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,KAAK,EAAE,SAAS,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,SAAyB,GAChC,MAAM,CAKR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,SAAyB,EACjC,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAOR;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CACnB,KAAK,EAAE,SAAS,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,SAAyB,GAChC,MAAM,CAmBR;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,GACxC,SAAS,GAAG,IAAI,CASlB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,CAAC,KAAK,EACxB,OAAO,EAAE,SAAS,CAAC,KAAK,EACxB,aAAa,EAAE,SAAS,CAAC,KAAK,GAC7B,OAAO,CAGT;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,CAAC,KAAK,GACrB,MAAM,CAgBR"}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.convertDecimals = exports.eqAmountApproximate = exports.tryParseAmount = exports.toWei = exports.fromWeiRounded = exports.fromWei = void 0;
|
|
7
|
-
const units_1 = require("@ethersproject/units");
|
|
8
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
1
|
+
import { formatUnits, parseUnits } from '@ethersproject/units';
|
|
2
|
+
import { BigNumber } from 'bignumber.js';
|
|
9
3
|
const DEFAULT_DISPLAY_DECIMALS = 4;
|
|
10
4
|
const DEFAULT_TOKEN_DECIMALS = 18;
|
|
11
5
|
/**
|
|
@@ -13,14 +7,13 @@ const DEFAULT_TOKEN_DECIMALS = 18;
|
|
|
13
7
|
* @param value The value to convert.
|
|
14
8
|
* @returns Converted value in string type.
|
|
15
9
|
*/
|
|
16
|
-
function fromWei(value, decimals = DEFAULT_TOKEN_DECIMALS) {
|
|
10
|
+
export function fromWei(value, decimals = DEFAULT_TOKEN_DECIMALS) {
|
|
17
11
|
if (!value)
|
|
18
12
|
return (0).toString();
|
|
19
13
|
const valueString = value.toString(10).trim();
|
|
20
|
-
const flooredValue = (
|
|
21
|
-
return parseFloat(
|
|
14
|
+
const flooredValue = BigNumber(valueString).toFixed(0, BigNumber.ROUND_FLOOR);
|
|
15
|
+
return parseFloat(formatUnits(flooredValue, decimals)).toString();
|
|
22
16
|
}
|
|
23
|
-
exports.fromWei = fromWei;
|
|
24
17
|
/**
|
|
25
18
|
* Convert the given Wei value to Ether value,
|
|
26
19
|
* round to set number of decimals with a minimum floor, configured per token
|
|
@@ -28,53 +21,51 @@ exports.fromWei = fromWei;
|
|
|
28
21
|
* @param decimals
|
|
29
22
|
* @returns Converted value in string type.
|
|
30
23
|
*/
|
|
31
|
-
function fromWeiRounded(value, decimals = DEFAULT_TOKEN_DECIMALS, displayDecimals) {
|
|
24
|
+
export function fromWeiRounded(value, decimals = DEFAULT_TOKEN_DECIMALS, displayDecimals) {
|
|
32
25
|
if (!value)
|
|
33
26
|
return '0';
|
|
34
|
-
const flooredValue = (
|
|
35
|
-
const amount = (
|
|
27
|
+
const flooredValue = BigNumber(value).toFixed(0, BigNumber.ROUND_FLOOR);
|
|
28
|
+
const amount = BigNumber(formatUnits(flooredValue, decimals));
|
|
36
29
|
if (amount.isZero())
|
|
37
30
|
return '0';
|
|
38
|
-
displayDecimals
|
|
39
|
-
return amount.toFixed(displayDecimals,
|
|
31
|
+
displayDecimals ??= amount.gte(10000) ? 2 : DEFAULT_DISPLAY_DECIMALS;
|
|
32
|
+
return amount.toFixed(displayDecimals, BigNumber.ROUND_FLOOR);
|
|
40
33
|
}
|
|
41
|
-
exports.fromWeiRounded = fromWeiRounded;
|
|
42
34
|
/**
|
|
43
35
|
* Convert the given value to Wei value
|
|
44
36
|
* @param value The value to convert.
|
|
45
37
|
* @returns Converted value in string type.
|
|
46
38
|
*/
|
|
47
|
-
function toWei(value, decimals = DEFAULT_TOKEN_DECIMALS) {
|
|
39
|
+
export function toWei(value, decimals = DEFAULT_TOKEN_DECIMALS) {
|
|
48
40
|
if (!value)
|
|
49
|
-
return (0
|
|
41
|
+
return BigNumber(0).toString();
|
|
50
42
|
// First convert to a BigNumber, and then call `toString` with the
|
|
51
43
|
// explicit radix 10 such that the result is formatted as a base-10 string
|
|
52
44
|
// and not in scientific notation.
|
|
53
|
-
const valueBN = (
|
|
45
|
+
const valueBN = BigNumber(value);
|
|
54
46
|
const valueString = valueBN.toString(10).trim();
|
|
55
47
|
const components = valueString.split('.');
|
|
56
48
|
if (components.length === 1) {
|
|
57
|
-
return
|
|
49
|
+
return parseUnits(valueString, decimals).toString();
|
|
58
50
|
}
|
|
59
51
|
else if (components.length === 2) {
|
|
60
52
|
const trimmedFraction = components[1].substring(0, decimals);
|
|
61
|
-
return
|
|
53
|
+
return parseUnits(`${components[0]}.${trimmedFraction}`, decimals).toString();
|
|
62
54
|
}
|
|
63
55
|
else {
|
|
64
56
|
throw new Error(`Cannot convert ${valueString} to wei`);
|
|
65
57
|
}
|
|
66
58
|
}
|
|
67
|
-
exports.toWei = toWei;
|
|
68
59
|
/**
|
|
69
60
|
* Try to parse the given value into BigNumber.js BigNumber
|
|
70
61
|
* @param value The value to parse.
|
|
71
62
|
* @returns Parsed value in BigNumber.js BigNumber type.
|
|
72
63
|
*/
|
|
73
|
-
function tryParseAmount(value) {
|
|
64
|
+
export function tryParseAmount(value) {
|
|
74
65
|
try {
|
|
75
66
|
if (!value)
|
|
76
67
|
return null;
|
|
77
|
-
const parsed = (
|
|
68
|
+
const parsed = BigNumber(value);
|
|
78
69
|
if (!parsed || parsed.isNaN() || !parsed.isFinite())
|
|
79
70
|
return null;
|
|
80
71
|
else
|
|
@@ -84,7 +75,6 @@ function tryParseAmount(value) {
|
|
|
84
75
|
return null;
|
|
85
76
|
}
|
|
86
77
|
}
|
|
87
|
-
exports.tryParseAmount = tryParseAmount;
|
|
88
78
|
/**
|
|
89
79
|
* Checks if an amount is equal of nearly equal to balance within a small margin of error
|
|
90
80
|
* Necessary because amounts in the UI are often rounded
|
|
@@ -92,11 +82,10 @@ exports.tryParseAmount = tryParseAmount;
|
|
|
92
82
|
* @param amount2 The amount to compare.
|
|
93
83
|
* @returns true/false.
|
|
94
84
|
*/
|
|
95
|
-
function eqAmountApproximate(amount1, amount2, maxDifference) {
|
|
85
|
+
export function eqAmountApproximate(amount1, amount2, maxDifference) {
|
|
96
86
|
// Is difference btwn amounts less than maxDifference
|
|
97
|
-
return (
|
|
87
|
+
return BigNumber(amount1).minus(amount2).abs().lte(maxDifference);
|
|
98
88
|
}
|
|
99
|
-
exports.eqAmountApproximate = eqAmountApproximate;
|
|
100
89
|
/**
|
|
101
90
|
* Converts a value with `fromDecimals` decimals to a value with `toDecimals` decimals.
|
|
102
91
|
* Incurs a loss of precision when `fromDecimals` > `toDecimals`.
|
|
@@ -105,22 +94,21 @@ exports.eqAmountApproximate = eqAmountApproximate;
|
|
|
105
94
|
* @param value The value to convert.
|
|
106
95
|
* @returns `value` represented with `toDecimals` decimals in string type.
|
|
107
96
|
*/
|
|
108
|
-
function convertDecimals(fromDecimals, toDecimals, value) {
|
|
109
|
-
const amount = (
|
|
97
|
+
export function convertDecimals(fromDecimals, toDecimals, value) {
|
|
98
|
+
const amount = BigNumber(value);
|
|
110
99
|
if (fromDecimals === toDecimals)
|
|
111
100
|
return amount.toString(10);
|
|
112
101
|
else if (fromDecimals > toDecimals) {
|
|
113
102
|
const difference = fromDecimals - toDecimals;
|
|
114
103
|
return amount
|
|
115
|
-
.div((
|
|
116
|
-
.integerValue(
|
|
104
|
+
.div(BigNumber(10).pow(difference))
|
|
105
|
+
.integerValue(BigNumber.ROUND_FLOOR)
|
|
117
106
|
.toString(10);
|
|
118
107
|
}
|
|
119
108
|
// fromDecimals < toDecimals
|
|
120
109
|
else {
|
|
121
110
|
const difference = toDecimals - fromDecimals;
|
|
122
|
-
return amount.times((
|
|
111
|
+
return amount.times(BigNumber(10).pow(difference)).toString(10);
|
|
123
112
|
}
|
|
124
113
|
}
|
|
125
|
-
exports.convertDecimals = convertDecimals;
|
|
126
114
|
//# sourceMappingURL=amount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount.js","sourceRoot":"","sources":["../src/amount.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amount.test.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"amount.test.d.ts","sourceRoot":"","sources":["../src/amount.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { eqAmountApproximate, fromWei, fromWeiRounded, toWei, } from './amount.js';
|
|
3
|
+
describe('fromWei', () => {
|
|
4
|
+
it('parses and converts correctly', () => {
|
|
5
|
+
expect(fromWei(1, 0)).to.equal('1');
|
|
6
|
+
expect(fromWei('1000000', 6)).to.equal('1');
|
|
7
|
+
expect(fromWei('1000000000000000000')).to.equal('1');
|
|
8
|
+
expect(fromWei('1000000000000000000.1234')).to.equal('1');
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('fromWeiRounded', () => {
|
|
12
|
+
it('parses and converts correctly', () => {
|
|
13
|
+
expect(fromWeiRounded(1, 0)).to.equal('1.0000');
|
|
14
|
+
expect(fromWeiRounded('1000000', 6)).to.equal('1.0000');
|
|
15
|
+
expect(fromWeiRounded('1000000000000000000')).to.equal('1.0000');
|
|
16
|
+
expect(fromWeiRounded('1000000000000000000.1234')).to.equal('1.0000');
|
|
17
|
+
});
|
|
18
|
+
it('rounds correctly', () => {
|
|
19
|
+
expect(fromWeiRounded(1234567890, 6, 2)).to.equal('1234.56');
|
|
20
|
+
expect(fromWeiRounded('1234567890', 6, 4)).to.equal('1234.5678');
|
|
21
|
+
expect(fromWeiRounded('10000000000000000000')).to.equal('10.0000');
|
|
22
|
+
expect(fromWeiRounded('10000000000000000000', 18, 0)).to.equal('10');
|
|
23
|
+
});
|
|
24
|
+
it('can drop decimals for large numbers', () => {
|
|
25
|
+
expect(fromWeiRounded('10001000000000000000000')).to.equal('10001.00');
|
|
26
|
+
expect(fromWeiRounded('10001000000000000000', 15, 4)).to.equal('10001.0000');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('toWei', () => {
|
|
30
|
+
it('parses and converts correctly', () => {
|
|
31
|
+
expect(toWei(1, 0)).to.equal('1');
|
|
32
|
+
expect(toWei('1', 6)).to.equal('1000000');
|
|
33
|
+
expect(toWei('123.456')).to.equal('123456000000000000000');
|
|
34
|
+
expect(toWei('1.00000000000000000001')).to.equal('1000000000000000000');
|
|
35
|
+
expect(toWei('1.00000000000000000001', 6)).to.equal('1000000');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('eqAmountApproximate', () => {
|
|
39
|
+
it('compares correctly', () => {
|
|
40
|
+
expect(eqAmountApproximate(1, 1.001, 0.001)).to.be.true;
|
|
41
|
+
expect(eqAmountApproximate(9, 9.001, 0.01)).to.be.true;
|
|
42
|
+
expect(eqAmountApproximate('9876543210', '9876543210', '1')).to.be.true;
|
|
43
|
+
expect(eqAmountApproximate('9876543210', '9876543212', '1')).to.be.false;
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=amount.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount.test.js","sourceRoot":"","sources":["../src/amount.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC;CACtC;AAED,wBAAgB,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,OAM9D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAE5C"}
|
package/dist/arrays.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function chunk(str, size) {
|
|
2
|
+
const R = [];
|
|
3
|
+
for (let i = 0; i < str.length; i += size) {
|
|
4
|
+
R.push(str.slice(i, i + size));
|
|
5
|
+
}
|
|
6
|
+
return R;
|
|
7
|
+
}
|
|
8
|
+
export function exclude(item, list) {
|
|
9
|
+
return list.filter((i) => i !== item);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=arrays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,KAAK,CAAsB,GAAM,EAAE,IAAY;IAC7D,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,IAAO,EAAE,IAAS;IAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACxC,CAAC"}
|