@hyperlane-xyz/utils 0.0.0-beta-20251201221151
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/addresses.d.ts +65 -0
- package/dist/addresses.d.ts.map +1 -0
- package/dist/addresses.js +475 -0
- package/dist/addresses.js.map +1 -0
- package/dist/addresses.test.d.ts +2 -0
- package/dist/addresses.test.d.ts.map +1 -0
- package/dist/addresses.test.js +68 -0
- package/dist/addresses.test.js.map +1 -0
- package/dist/amount.d.ts +70 -0
- package/dist/amount.d.ts.map +1 -0
- package/dist/amount.js +143 -0
- package/dist/amount.js.map +1 -0
- package/dist/amount.test.d.ts +2 -0
- package/dist/amount.test.d.ts.map +1 -0
- package/dist/amount.test.js +113 -0
- package/dist/amount.test.js.map +1 -0
- package/dist/arrays.d.ts +11 -0
- package/dist/arrays.d.ts.map +1 -0
- package/dist/arrays.js +26 -0
- package/dist/arrays.js.map +1 -0
- package/dist/arrays.test.d.ts +2 -0
- package/dist/arrays.test.d.ts.map +1 -0
- package/dist/arrays.test.js +77 -0
- package/dist/arrays.test.js.map +1 -0
- package/dist/async.d.ts +66 -0
- package/dist/async.d.ts.map +1 -0
- package/dist/async.js +146 -0
- package/dist/async.js.map +1 -0
- package/dist/async.test.d.ts +2 -0
- package/dist/async.test.d.ts.map +1 -0
- package/dist/async.test.js +204 -0
- package/dist/async.test.js.map +1 -0
- package/dist/base58.d.ts +5 -0
- package/dist/base58.d.ts.map +1 -0
- package/dist/base58.js +15 -0
- package/dist/base58.js.map +1 -0
- package/dist/base58.test.d.ts +2 -0
- package/dist/base58.test.d.ts.map +1 -0
- package/dist/base58.test.js +31 -0
- package/dist/base58.test.js.map +1 -0
- package/dist/base64.d.ts +3 -0
- package/dist/base64.d.ts.map +1 -0
- package/dist/base64.js +25 -0
- package/dist/base64.js.map +1 -0
- package/dist/base64.test.d.ts +2 -0
- package/dist/base64.test.d.ts.map +1 -0
- package/dist/base64.test.js +54 -0
- package/dist/base64.test.js.map +1 -0
- package/dist/big-numbers.d.ts +50 -0
- package/dist/big-numbers.d.ts.map +1 -0
- package/dist/big-numbers.js +80 -0
- package/dist/big-numbers.js.map +1 -0
- package/dist/big-numbers.test.d.ts +2 -0
- package/dist/big-numbers.test.d.ts.map +1 -0
- package/dist/big-numbers.test.js +96 -0
- package/dist/big-numbers.test.js.map +1 -0
- package/dist/calldata.d.ts +3 -0
- package/dist/calldata.d.ts.map +1 -0
- package/dist/calldata.js +4 -0
- package/dist/calldata.js.map +1 -0
- package/dist/checkpoints.d.ts +6 -0
- package/dist/checkpoints.d.ts.map +1 -0
- package/dist/checkpoints.js +24 -0
- package/dist/checkpoints.js.map +1 -0
- package/dist/checkpoints.test.d.ts +2 -0
- package/dist/checkpoints.test.d.ts.map +1 -0
- package/dist/checkpoints.test.js +105 -0
- package/dist/checkpoints.test.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/domains.d.ts +2 -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 +4 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +17 -0
- package/dist/env.js.map +1 -0
- package/dist/env.test.d.ts +2 -0
- package/dist/env.test.d.ts.map +1 -0
- package/dist/env.test.js +16 -0
- package/dist/env.test.js.map +1 -0
- package/dist/eslint-rules/index.d.ts +157 -0
- package/dist/eslint-rules/index.d.ts.map +1 -0
- package/dist/eslint-rules/index.js +58 -0
- package/dist/eslint-rules/index.js.map +1 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.d.ts +4 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.d.ts.map +1 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.js +141 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.js.map +1 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.test.d.ts +2 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.test.d.ts.map +1 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.test.js +258 -0
- package/dist/eslint-rules/no-restricted-imports-from-exports.test.js.map +1 -0
- package/dist/eslint-rules/sort-yaml-arrays.d.ts +39 -0
- package/dist/eslint-rules/sort-yaml-arrays.d.ts.map +1 -0
- package/dist/eslint-rules/sort-yaml-arrays.js +74 -0
- package/dist/eslint-rules/sort-yaml-arrays.js.map +1 -0
- package/dist/eslint-rules/sort-yaml-arrays.test.d.ts +2 -0
- package/dist/eslint-rules/sort-yaml-arrays.test.d.ts.map +1 -0
- package/dist/eslint-rules/sort-yaml-arrays.test.js +621 -0
- package/dist/eslint-rules/sort-yaml-arrays.test.js.map +1 -0
- package/dist/ids.d.ts +20 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +42 -0
- package/dist/ids.js.map +1 -0
- package/dist/ids.test.d.ts +2 -0
- package/dist/ids.test.d.ts.map +1 -0
- package/dist/ids.test.js +39 -0
- package/dist/ids.test.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +32 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +146 -0
- package/dist/logging.js.map +1 -0
- package/dist/logging.test.d.ts +2 -0
- package/dist/logging.test.d.ts.map +1 -0
- package/dist/logging.test.js +35 -0
- package/dist/logging.test.js.map +1 -0
- package/dist/math.d.ts +6 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +21 -0
- package/dist/math.js.map +1 -0
- package/dist/math.test.d.ts +2 -0
- package/dist/math.test.d.ts.map +1 -0
- package/dist/math.test.js +45 -0
- package/dist/math.test.js.map +1 -0
- package/dist/messages.d.ts +22 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +64 -0
- package/dist/messages.js.map +1 -0
- package/dist/multisig.d.ts +4 -0
- 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 +74 -0
- package/dist/objects.d.ts.map +1 -0
- package/dist/objects.js +331 -0
- package/dist/objects.js.map +1 -0
- package/dist/objects.test.d.ts +2 -0
- package/dist/objects.test.d.ts.map +1 -0
- package/dist/objects.test.js +655 -0
- package/dist/objects.test.js.map +1 -0
- package/dist/result.d.ts +11 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +7 -0
- package/dist/result.js.map +1 -0
- package/dist/sets.d.ts +5 -0
- package/dist/sets.d.ts.map +1 -0
- package/dist/sets.js +33 -0
- package/dist/sets.js.map +1 -0
- package/dist/sets.test.d.ts +2 -0
- package/dist/sets.test.d.ts.map +1 -0
- package/dist/sets.test.js +35 -0
- package/dist/sets.test.js.map +1 -0
- package/dist/strings.d.ts +11 -0
- package/dist/strings.d.ts.map +1 -0
- package/dist/strings.js +49 -0
- package/dist/strings.js.map +1 -0
- package/dist/strings.test.d.ts +2 -0
- package/dist/strings.test.d.ts.map +1 -0
- package/dist/strings.test.js +42 -0
- package/dist/strings.test.js.map +1 -0
- package/dist/typeof.d.ts +3 -0
- package/dist/typeof.d.ts.map +1 -0
- package/dist/typeof.js +7 -0
- package/dist/typeof.js.map +1 -0
- package/dist/typeof.test.d.ts +2 -0
- package/dist/typeof.test.d.ts.map +1 -0
- package/dist/typeof.test.js +34 -0
- package/dist/typeof.test.js.map +1 -0
- package/dist/types.d.ts +111 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/url.d.ts +4 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +34 -0
- package/dist/url.js.map +1 -0
- package/dist/url.test.d.ts +2 -0
- package/dist/url.test.d.ts.map +1 -0
- package/dist/url.test.js +29 -0
- package/dist/url.test.js.map +1 -0
- package/dist/validation.d.ts +2 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +6 -0
- package/dist/validation.js.map +1 -0
- package/dist/validation.test.d.ts +2 -0
- package/dist/validation.test.d.ts.map +1 -0
- package/dist/validation.test.js +11 -0
- package/dist/validation.test.js.map +1 -0
- package/dist/validator.d.ts +30 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +76 -0
- package/dist/validator.js.map +1 -0
- package/dist/yaml.d.ts +22 -0
- package/dist/yaml.d.ts.map +1 -0
- package/dist/yaml.js +293 -0
- package/dist/yaml.js.map +1 -0
- package/dist/yaml.test.d.ts +2 -0
- package/dist/yaml.test.d.ts.map +1 -0
- package/dist/yaml.test.js +519 -0
- package/dist/yaml.test.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { addressToBytes, bytesToProtocolAddress, isZeroishAddress, padBytesToLength, } 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 COSMOS_PREFIX = 'neutron';
|
|
9
|
+
const COSMOS_NATIVE_ZERO_ADDR = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
|
10
|
+
const COSMOS_NATIVE_NON_ZERO_ADDR = '0x726f757465725f61707000000000000000000000000000010000000000000000';
|
|
11
|
+
const SOL_ZERO_ADDR = '111111';
|
|
12
|
+
const SOL_NON_ZERO_ADDR = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
|
|
13
|
+
const STARKNET_ZERO_ADDR = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
|
14
|
+
const STARKNET_NON_ZERO_ADDR = '0x0000000000000000000000000000000000000000000000000000000000000001';
|
|
15
|
+
// TODO increase address utility test coverage
|
|
16
|
+
describe('Address utilities', () => {
|
|
17
|
+
describe('isZeroishAddress', () => {
|
|
18
|
+
it('Identifies 0-ish addresses', () => {
|
|
19
|
+
expect(isZeroishAddress('0x')).to.be.true;
|
|
20
|
+
expect(isZeroishAddress(ETH_ZERO_ADDR)).to.be.true;
|
|
21
|
+
expect(isZeroishAddress(COS_ZERO_ADDR)).to.be.true;
|
|
22
|
+
expect(isZeroishAddress(COSMOS_NATIVE_ZERO_ADDR)).to.be.true;
|
|
23
|
+
expect(isZeroishAddress(SOL_ZERO_ADDR)).to.be.true;
|
|
24
|
+
expect(isZeroishAddress(STARKNET_ZERO_ADDR)).to.be.true;
|
|
25
|
+
});
|
|
26
|
+
it('Identifies non-0-ish addresses', () => {
|
|
27
|
+
expect(isZeroishAddress(ETH_NON_ZERO_ADDR)).to.be.false;
|
|
28
|
+
expect(isZeroishAddress(COS_NON_ZERO_ADDR)).to.be.false;
|
|
29
|
+
expect(isZeroishAddress(COSMOS_NATIVE_NON_ZERO_ADDR)).to.be.false;
|
|
30
|
+
expect(isZeroishAddress(SOL_NON_ZERO_ADDR)).to.be.false;
|
|
31
|
+
expect(isZeroishAddress(STARKNET_NON_ZERO_ADDR)).to.be.false;
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('addressToBytes', () => {
|
|
35
|
+
it('Converts addresses to bytes', () => {
|
|
36
|
+
expect(addressToBytes(ETH_NON_ZERO_ADDR).length).to.equal(32);
|
|
37
|
+
expect(addressToBytes(STARKNET_NON_ZERO_ADDR).length).to.equal(32);
|
|
38
|
+
});
|
|
39
|
+
it('Rejects zeroish addresses', () => {
|
|
40
|
+
expect(() => addressToBytes(ETH_ZERO_ADDR)).to.throw(Error);
|
|
41
|
+
expect(() => addressToBytes(COS_ZERO_ADDR)).to.throw(Error);
|
|
42
|
+
expect(() => addressToBytes(COSMOS_NATIVE_ZERO_ADDR)).to.throw(Error);
|
|
43
|
+
expect(() => addressToBytes(SOL_ZERO_ADDR)).to.throw(Error);
|
|
44
|
+
expect(() => addressToBytes(STARKNET_ZERO_ADDR)).to.throw(Error);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('padBytesToLength', () => {
|
|
48
|
+
it('Pads bytes to a given length', () => {
|
|
49
|
+
const bytes = Buffer.from([1, 2, 3]);
|
|
50
|
+
expect(padBytesToLength(bytes, 5).equals(Buffer.from([0, 0, 1, 2, 3])));
|
|
51
|
+
});
|
|
52
|
+
it('Rejects bytes that exceed the target length', () => {
|
|
53
|
+
const bytes = Buffer.from([1, 2, 3]);
|
|
54
|
+
expect(() => padBytesToLength(bytes, 2)).to.throw(Error);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('bytesToProtocolAddress', () => {
|
|
58
|
+
it('Converts bytes to address', () => {
|
|
59
|
+
expect(bytesToProtocolAddress(addressToBytes(ETH_NON_ZERO_ADDR), ProtocolType.Ethereum)).to.equal(ETH_NON_ZERO_ADDR);
|
|
60
|
+
expect(bytesToProtocolAddress(addressToBytes(COSMOS_NATIVE_NON_ZERO_ADDR), ProtocolType.CosmosNative, COSMOS_PREFIX)).to.equal(COSMOS_NATIVE_NON_ZERO_ADDR);
|
|
61
|
+
expect(bytesToProtocolAddress(addressToBytes(STARKNET_NON_ZERO_ADDR), ProtocolType.Starknet)).to.equal(STARKNET_NON_ZERO_ADDR);
|
|
62
|
+
});
|
|
63
|
+
it('Rejects zeroish addresses', () => {
|
|
64
|
+
expect(() => bytesToProtocolAddress(new Uint8Array([0, 0, 0]), ProtocolType.Ethereum)).to.throw(Error);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# 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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"}
|
package/dist/amount.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { BigNumber } from 'bignumber.js';
|
|
2
|
+
import { ethers } from 'ethers';
|
|
3
|
+
/**
|
|
4
|
+
* Convert the given Wei value to Ether value
|
|
5
|
+
* @param value The value to convert.
|
|
6
|
+
* @returns Converted value in string type.
|
|
7
|
+
*/
|
|
8
|
+
export declare function fromWei(value: BigNumber.Value | null | undefined, decimals?: number): string;
|
|
9
|
+
/**
|
|
10
|
+
* Convert the given Wei value to Ether value,
|
|
11
|
+
* round to set number of decimals with a minimum floor, configured per token
|
|
12
|
+
* @param value The value to convert.
|
|
13
|
+
* @param decimals
|
|
14
|
+
* @returns Converted value in string type.
|
|
15
|
+
*/
|
|
16
|
+
export declare function fromWeiRounded(value: BigNumber.Value | null | undefined, decimals?: number, displayDecimals?: number): string;
|
|
17
|
+
/**
|
|
18
|
+
* Convert the given value to Wei value
|
|
19
|
+
* @param value The value to convert.
|
|
20
|
+
* @returns Converted value in string type.
|
|
21
|
+
*/
|
|
22
|
+
export declare function toWei(value: BigNumber.Value | null | undefined, decimals?: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Try to parse the given value into BigNumber.js BigNumber
|
|
25
|
+
* @param value The value to parse.
|
|
26
|
+
* @returns Parsed value in BigNumber.js BigNumber type.
|
|
27
|
+
*/
|
|
28
|
+
export declare function tryParseAmount(value: BigNumber.Value | null | undefined): BigNumber | null;
|
|
29
|
+
/**
|
|
30
|
+
* Checks if an amount is equal of nearly equal to balance within a small margin of error
|
|
31
|
+
* Necessary because amounts in the UI are often rounded
|
|
32
|
+
* @param amount1 The amount to compare.
|
|
33
|
+
* @param amount2 The amount to compare.
|
|
34
|
+
* @returns true/false.
|
|
35
|
+
*/
|
|
36
|
+
export declare function eqAmountApproximate(amount1: BigNumber.Value, amount2: BigNumber.Value, maxDifference: BigNumber.Value): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Converts a value with `fromDecimals` decimals to a value with `toDecimals` decimals.
|
|
39
|
+
* Incurs a loss of precision when `fromDecimals` > `toDecimals`.
|
|
40
|
+
* @param fromDecimals The number of decimals `value` has.
|
|
41
|
+
* @param toDecimals The number of decimals to convert `value` to.
|
|
42
|
+
* @param value The value to convert.
|
|
43
|
+
* @returns `value` represented with `toDecimals` decimals in string type.
|
|
44
|
+
*/
|
|
45
|
+
export declare function convertDecimalsToIntegerString(fromDecimals: number, toDecimals: number, value: BigNumber.Value): string;
|
|
46
|
+
export declare function convertDecimals(fromDecimals: number, toDecimals: number, value: BigNumber.Value): BigNumber;
|
|
47
|
+
/**
|
|
48
|
+
* Calculates the gas limit with a buffer added to the estimated gas.
|
|
49
|
+
* @param estimatedGas The estimated gas for the transaction.
|
|
50
|
+
* @param bufferPercent The percentage to add as a buffer (default: 10%).
|
|
51
|
+
* @returns The calculated gas limit with the buffer added.
|
|
52
|
+
*/
|
|
53
|
+
export declare function addBufferToGasLimit(estimatedGas: ethers.BigNumber, bufferPercent?: number): ethers.BigNumber;
|
|
54
|
+
/**
|
|
55
|
+
* Calculates the amount from the origin chain scaled to the destination chain
|
|
56
|
+
* This calculation is in line with the FungibleTokenRouter contract _outboundAmount
|
|
57
|
+
* and _inboundAmount functions
|
|
58
|
+
* @param fromScale The origin scale number.
|
|
59
|
+
* @param toScale The destination scale number.
|
|
60
|
+
* @param amount The number to scale.
|
|
61
|
+
* @param precisionFactor Number used to get accurate conversion for smaller numbers.
|
|
62
|
+
* Take into account the resulting amount will be have this precision factor multiplied into it.
|
|
63
|
+
*/
|
|
64
|
+
export declare function convertToScaledAmount({ amount, fromScale, toScale, precisionFactor, }: {
|
|
65
|
+
fromScale?: number;
|
|
66
|
+
toScale?: number;
|
|
67
|
+
amount: bigint;
|
|
68
|
+
precisionFactor: number;
|
|
69
|
+
}): bigint;
|
|
70
|
+
//# sourceMappingURL=amount.d.ts.map
|
|
@@ -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;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC;;;;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,8BAA8B,CAC5C,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,CAAC,KAAK,GACrB,MAAM,CAGR;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,CAAC,KAAK,GACrB,SAAS,CAaX;AAKD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,CAAC,SAAS,EAC9B,aAAa,GAAE,MAAyC,GACvD,MAAM,CAAC,SAAS,CAGlB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,SAAS,EACT,OAAO,EACP,eAAe,GAChB,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB,UAOA"}
|
package/dist/amount.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { formatUnits, parseUnits } from '@ethersproject/units';
|
|
2
|
+
import { BigNumber } from 'bignumber.js';
|
|
3
|
+
const DEFAULT_DISPLAY_DECIMALS = 4;
|
|
4
|
+
const DEFAULT_TOKEN_DECIMALS = 18;
|
|
5
|
+
/**
|
|
6
|
+
* Convert the given Wei value to Ether value
|
|
7
|
+
* @param value The value to convert.
|
|
8
|
+
* @returns Converted value in string type.
|
|
9
|
+
*/
|
|
10
|
+
export function fromWei(value, decimals = DEFAULT_TOKEN_DECIMALS) {
|
|
11
|
+
if (!value)
|
|
12
|
+
return (0).toString();
|
|
13
|
+
const valueString = value.toString(10).trim();
|
|
14
|
+
const flooredValue = BigNumber(valueString).toFixed(0, BigNumber.ROUND_FLOOR);
|
|
15
|
+
return parseFloat(formatUnits(flooredValue, decimals)).toString();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Convert the given Wei value to Ether value,
|
|
19
|
+
* round to set number of decimals with a minimum floor, configured per token
|
|
20
|
+
* @param value The value to convert.
|
|
21
|
+
* @param decimals
|
|
22
|
+
* @returns Converted value in string type.
|
|
23
|
+
*/
|
|
24
|
+
export function fromWeiRounded(value, decimals = DEFAULT_TOKEN_DECIMALS, displayDecimals) {
|
|
25
|
+
if (!value)
|
|
26
|
+
return '0';
|
|
27
|
+
const flooredValue = BigNumber(value).toFixed(0, BigNumber.ROUND_FLOOR);
|
|
28
|
+
const amount = BigNumber(formatUnits(flooredValue, decimals));
|
|
29
|
+
if (amount.isZero())
|
|
30
|
+
return '0';
|
|
31
|
+
displayDecimals ??= amount.gte(10000) ? 2 : DEFAULT_DISPLAY_DECIMALS;
|
|
32
|
+
return amount.toFixed(displayDecimals, BigNumber.ROUND_FLOOR);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Convert the given value to Wei value
|
|
36
|
+
* @param value The value to convert.
|
|
37
|
+
* @returns Converted value in string type.
|
|
38
|
+
*/
|
|
39
|
+
export function toWei(value, decimals = DEFAULT_TOKEN_DECIMALS) {
|
|
40
|
+
if (!value)
|
|
41
|
+
return BigNumber(0).toString();
|
|
42
|
+
// First convert to a BigNumber, and then call `toString` with the
|
|
43
|
+
// explicit radix 10 such that the result is formatted as a base-10 string
|
|
44
|
+
// and not in scientific notation.
|
|
45
|
+
const valueBN = BigNumber(value);
|
|
46
|
+
const valueString = valueBN.toString(10).trim();
|
|
47
|
+
const components = valueString.split('.');
|
|
48
|
+
if (components.length === 1) {
|
|
49
|
+
return parseUnits(valueString, decimals).toString();
|
|
50
|
+
}
|
|
51
|
+
else if (components.length === 2) {
|
|
52
|
+
const trimmedFraction = components[1].substring(0, decimals);
|
|
53
|
+
return parseUnits(`${components[0]}.${trimmedFraction}`, decimals).toString();
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
throw new Error(`Cannot convert ${valueString} to wei`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Try to parse the given value into BigNumber.js BigNumber
|
|
61
|
+
* @param value The value to parse.
|
|
62
|
+
* @returns Parsed value in BigNumber.js BigNumber type.
|
|
63
|
+
*/
|
|
64
|
+
export function tryParseAmount(value) {
|
|
65
|
+
try {
|
|
66
|
+
if (!value)
|
|
67
|
+
return null;
|
|
68
|
+
const parsed = BigNumber(value);
|
|
69
|
+
if (!parsed || parsed.isNaN() || !parsed.isFinite())
|
|
70
|
+
return null;
|
|
71
|
+
else
|
|
72
|
+
return parsed;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Checks if an amount is equal of nearly equal to balance within a small margin of error
|
|
80
|
+
* Necessary because amounts in the UI are often rounded
|
|
81
|
+
* @param amount1 The amount to compare.
|
|
82
|
+
* @param amount2 The amount to compare.
|
|
83
|
+
* @returns true/false.
|
|
84
|
+
*/
|
|
85
|
+
export function eqAmountApproximate(amount1, amount2, maxDifference) {
|
|
86
|
+
// Is difference btwn amounts less than maxDifference
|
|
87
|
+
return BigNumber(amount1).minus(amount2).abs().lte(maxDifference);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Converts a value with `fromDecimals` decimals to a value with `toDecimals` decimals.
|
|
91
|
+
* Incurs a loss of precision when `fromDecimals` > `toDecimals`.
|
|
92
|
+
* @param fromDecimals The number of decimals `value` has.
|
|
93
|
+
* @param toDecimals The number of decimals to convert `value` to.
|
|
94
|
+
* @param value The value to convert.
|
|
95
|
+
* @returns `value` represented with `toDecimals` decimals in string type.
|
|
96
|
+
*/
|
|
97
|
+
export function convertDecimalsToIntegerString(fromDecimals, toDecimals, value) {
|
|
98
|
+
const converted = convertDecimals(fromDecimals, toDecimals, value);
|
|
99
|
+
return converted.integerValue(BigNumber.ROUND_FLOOR).toString(10);
|
|
100
|
+
}
|
|
101
|
+
export function convertDecimals(fromDecimals, toDecimals, value) {
|
|
102
|
+
const amount = BigNumber(value);
|
|
103
|
+
if (fromDecimals === toDecimals)
|
|
104
|
+
return amount;
|
|
105
|
+
else if (fromDecimals > toDecimals) {
|
|
106
|
+
const difference = fromDecimals - toDecimals;
|
|
107
|
+
return amount.div(BigNumber(10).pow(difference));
|
|
108
|
+
}
|
|
109
|
+
// fromDecimals < toDecimals
|
|
110
|
+
else {
|
|
111
|
+
const difference = toDecimals - fromDecimals;
|
|
112
|
+
return amount.times(BigNumber(10).pow(difference));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Default gas limit buffer percentage
|
|
116
|
+
const DEFAULT_GAS_LIMIT_BUFFER_PERCENT = 10;
|
|
117
|
+
/**
|
|
118
|
+
* Calculates the gas limit with a buffer added to the estimated gas.
|
|
119
|
+
* @param estimatedGas The estimated gas for the transaction.
|
|
120
|
+
* @param bufferPercent The percentage to add as a buffer (default: 10%).
|
|
121
|
+
* @returns The calculated gas limit with the buffer added.
|
|
122
|
+
*/
|
|
123
|
+
export function addBufferToGasLimit(estimatedGas, bufferPercent = DEFAULT_GAS_LIMIT_BUFFER_PERCENT) {
|
|
124
|
+
const bufferMultiplier = 100 + bufferPercent;
|
|
125
|
+
return estimatedGas.mul(bufferMultiplier).div(100);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Calculates the amount from the origin chain scaled to the destination chain
|
|
129
|
+
* This calculation is in line with the FungibleTokenRouter contract _outboundAmount
|
|
130
|
+
* and _inboundAmount functions
|
|
131
|
+
* @param fromScale The origin scale number.
|
|
132
|
+
* @param toScale The destination scale number.
|
|
133
|
+
* @param amount The number to scale.
|
|
134
|
+
* @param precisionFactor Number used to get accurate conversion for smaller numbers.
|
|
135
|
+
* Take into account the resulting amount will be have this precision factor multiplied into it.
|
|
136
|
+
*/
|
|
137
|
+
export function convertToScaledAmount({ amount, fromScale, toScale, precisionFactor, }) {
|
|
138
|
+
if (!fromScale || !toScale || fromScale === toScale)
|
|
139
|
+
return amount * BigInt(Math.floor(precisionFactor));
|
|
140
|
+
const scaledAmount = amount * BigInt(Math.floor((fromScale * precisionFactor) / toScale));
|
|
141
|
+
return scaledAmount;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=amount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount.js","sourceRoot":"","sources":["../src/amount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,OAAO,CACrB,KAAyC,EACzC,QAAQ,GAAG,sBAAsB;IAEjC,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9E,OAAO,UAAU,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAyC,EACzC,QAAQ,GAAG,sBAAsB,EACjC,eAAwB;IAExB,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,GAAG,CAAC;IAChC,eAAe,KAAK,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC;IACrE,OAAO,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CACnB,KAAyC,EACzC,QAAQ,GAAG,sBAAsB;IAEjC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,kEAAkE;IAClE,0EAA0E;IAC1E,kCAAkC;IAClC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7D,OAAO,UAAU,CACf,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,EACrC,QAAQ,CACT,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,kBAAkB,WAAW,SAAS,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAyC;IAEzC,IAAI,CAAC;QACH,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAC;;YAC5D,OAAO,MAAM,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAwB,EACxB,OAAwB,EACxB,aAA8B;IAE9B,qDAAqD;IACrD,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,8BAA8B,CAC5C,YAAoB,EACpB,UAAkB,EAClB,KAAsB;IAEtB,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,YAAoB,EACpB,UAAkB,EAClB,KAAsB;IAEtB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEhC,IAAI,YAAY,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;SAC1C,IAAI,YAAY,GAAG,UAAU,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;QAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,4BAA4B;SACvB,CAAC;QACJ,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;QAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,sCAAsC;AACtC,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAA8B,EAC9B,gBAAwB,gCAAgC;IAExD,MAAM,gBAAgB,GAAG,GAAG,GAAG,aAAa,CAAC;IAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,MAAM,EACN,SAAS,EACT,OAAO,EACP,eAAe,GAMhB;IACC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,OAAO;QACjD,OAAO,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtD,MAAM,YAAY,GAChB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,eAAe,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACvE,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount.test.d.ts","sourceRoot":"","sources":["../src/amount.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { convertToScaledAmount, 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
|
+
describe('convertToScaledAmount', () => {
|
|
47
|
+
it('returns the original amount when scales are equal or undefined', () => {
|
|
48
|
+
const amount = 1000n;
|
|
49
|
+
const precisionFactor = 100;
|
|
50
|
+
const expectedAmount = amount * BigInt(Math.floor(precisionFactor));
|
|
51
|
+
expect(convertToScaledAmount({ toScale: 6, amount, precisionFactor: 100 })).to.equal(expectedAmount);
|
|
52
|
+
expect(convertToScaledAmount({ fromScale: 6, amount, precisionFactor: 100 })).to.equal(expectedAmount);
|
|
53
|
+
expect(convertToScaledAmount({
|
|
54
|
+
fromScale: 6,
|
|
55
|
+
toScale: 6,
|
|
56
|
+
amount,
|
|
57
|
+
precisionFactor: 100,
|
|
58
|
+
})).to.equal(expectedAmount);
|
|
59
|
+
});
|
|
60
|
+
it('scales properly when fromScale is higher than toScale', () => {
|
|
61
|
+
expect(convertToScaledAmount({
|
|
62
|
+
fromScale: 10,
|
|
63
|
+
toScale: 1,
|
|
64
|
+
amount: 10n,
|
|
65
|
+
precisionFactor: 100000,
|
|
66
|
+
})).to.equal(10000000n);
|
|
67
|
+
expect(convertToScaledAmount({
|
|
68
|
+
fromScale: 8,
|
|
69
|
+
toScale: 2,
|
|
70
|
+
amount: 99n,
|
|
71
|
+
precisionFactor: 100000,
|
|
72
|
+
})).to.equal(39600000n);
|
|
73
|
+
expect(convertToScaledAmount({
|
|
74
|
+
fromScale: 7,
|
|
75
|
+
toScale: 2,
|
|
76
|
+
amount: 1n,
|
|
77
|
+
precisionFactor: 100000,
|
|
78
|
+
})).to.equal(350000n);
|
|
79
|
+
expect(convertToScaledAmount({
|
|
80
|
+
fromScale: 5,
|
|
81
|
+
toScale: 3,
|
|
82
|
+
amount: 10n,
|
|
83
|
+
precisionFactor: 1000,
|
|
84
|
+
})).to.equal(16660n);
|
|
85
|
+
});
|
|
86
|
+
it('scales properly when fromScale is lower than toScale', () => {
|
|
87
|
+
expect(convertToScaledAmount({
|
|
88
|
+
fromScale: 1,
|
|
89
|
+
toScale: 10,
|
|
90
|
+
amount: 10n,
|
|
91
|
+
precisionFactor: 100000,
|
|
92
|
+
})).to.equal(100000n);
|
|
93
|
+
expect(convertToScaledAmount({
|
|
94
|
+
fromScale: 2,
|
|
95
|
+
toScale: 8,
|
|
96
|
+
amount: 99n,
|
|
97
|
+
precisionFactor: 100000,
|
|
98
|
+
})).to.equal(2475000n);
|
|
99
|
+
expect(convertToScaledAmount({
|
|
100
|
+
fromScale: 2,
|
|
101
|
+
toScale: 7,
|
|
102
|
+
amount: 1n,
|
|
103
|
+
precisionFactor: 100000,
|
|
104
|
+
})).to.equal(28571n);
|
|
105
|
+
expect(convertToScaledAmount({
|
|
106
|
+
fromScale: 3,
|
|
107
|
+
toScale: 5,
|
|
108
|
+
amount: 10n,
|
|
109
|
+
precisionFactor: 1000,
|
|
110
|
+
})).to.equal(6000n);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# 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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"}
|
package/dist/arrays.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Sliceable {
|
|
2
|
+
length: number;
|
|
3
|
+
slice: (i: number, j: number) => any;
|
|
4
|
+
}
|
|
5
|
+
export declare function chunk<T extends Sliceable>(str: T, size: number): T[];
|
|
6
|
+
export declare function exclude<T>(item: T, list: T[]): T[];
|
|
7
|
+
export declare function randomElement<T>(list: T[]): T;
|
|
8
|
+
export declare function sortArrayByKey<T extends Record<keyof T, any>>(array: T[], sortKey: keyof T): T[];
|
|
9
|
+
export declare function arrayEqual<T>(a: T[], b: T[]): boolean;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=arrays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAIA,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;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAEzC;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAC3D,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE,MAAM,CAAC,GACf,CAAC,EAAE,CAEL;AAGD,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAMrD"}
|
package/dist/arrays.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { sortBy } from 'lodash-es';
|
|
2
|
+
import { randomInt } from './math.js';
|
|
3
|
+
export function chunk(str, size) {
|
|
4
|
+
const R = [];
|
|
5
|
+
for (let i = 0; i < str.length; i += size) {
|
|
6
|
+
R.push(str.slice(i, i + size));
|
|
7
|
+
}
|
|
8
|
+
return R;
|
|
9
|
+
}
|
|
10
|
+
export function exclude(item, list) {
|
|
11
|
+
return list.filter((i) => i !== item);
|
|
12
|
+
}
|
|
13
|
+
export function randomElement(list) {
|
|
14
|
+
return list[randomInt(list.length)];
|
|
15
|
+
}
|
|
16
|
+
export function sortArrayByKey(array, sortKey) {
|
|
17
|
+
return sortBy(array, [(item) => item[sortKey]]);
|
|
18
|
+
}
|
|
19
|
+
// Validates that 2 arrays are equal in both ordering and elements
|
|
20
|
+
export function arrayEqual(a, b) {
|
|
21
|
+
if (a.length !== b.length) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return a.every((item, idx) => item === b[idx]);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=arrays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC,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;AAED,MAAM,UAAU,aAAa,CAAI,IAAS;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAU,EACV,OAAgB;IAEhB,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAI,CAAM,EAAE,CAAM;IAC1C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrays.test.d.ts","sourceRoot":"","sources":["../src/arrays.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { chunk, exclude, randomElement, sortArrayByKey } from './arrays.js';
|
|
3
|
+
describe('Arrays utilities', () => {
|
|
4
|
+
describe('chunk', () => {
|
|
5
|
+
it('should split an array into chunks of the specified size', () => {
|
|
6
|
+
const result = chunk([1, 2, 3, 4, 5], 2);
|
|
7
|
+
expect(result).to.deep.equal([[1, 2], [3, 4], [5]]);
|
|
8
|
+
});
|
|
9
|
+
it('should return an empty array when input is empty', () => {
|
|
10
|
+
const result = chunk([], 2);
|
|
11
|
+
expect(result).to.deep.equal([]);
|
|
12
|
+
});
|
|
13
|
+
it('should handle chunk size larger than array length', () => {
|
|
14
|
+
const result = chunk([1, 2], 5);
|
|
15
|
+
expect(result).to.deep.equal([[1, 2]]);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('exclude', () => {
|
|
19
|
+
it('should exclude the specified item from the list', () => {
|
|
20
|
+
const result = exclude(2, [1, 2, 3, 2]);
|
|
21
|
+
expect(result).to.deep.equal([1, 3]);
|
|
22
|
+
});
|
|
23
|
+
it('should return the same list if item is not found', () => {
|
|
24
|
+
const result = exclude(4, [1, 2, 3]);
|
|
25
|
+
expect(result).to.deep.equal([1, 2, 3]);
|
|
26
|
+
});
|
|
27
|
+
it('should return an empty list if all items are excluded', () => {
|
|
28
|
+
const result = exclude(1, [1, 1, 1]);
|
|
29
|
+
expect(result).to.deep.equal([]);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('randomElement', () => {
|
|
33
|
+
beforeEach(() => { });
|
|
34
|
+
it('should return a random element from the list', () => {
|
|
35
|
+
const list = [10, 20, 30];
|
|
36
|
+
const result = randomElement(list);
|
|
37
|
+
expect(result).to.be.oneOf(list);
|
|
38
|
+
});
|
|
39
|
+
it('should handle an empty list gracefully', () => {
|
|
40
|
+
const result = randomElement([]);
|
|
41
|
+
expect(result).to.be.undefined;
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('sortArrayByKey', () => {
|
|
45
|
+
it('should sort objects by string key in ascending order', () => {
|
|
46
|
+
const array = [
|
|
47
|
+
{ name: 'Charlie', id: 3 },
|
|
48
|
+
{ name: 'Alice', id: 1 },
|
|
49
|
+
{ name: 'Bob', id: 2 },
|
|
50
|
+
];
|
|
51
|
+
const result = sortArrayByKey(array, 'name');
|
|
52
|
+
expect(result).to.deep.equal([
|
|
53
|
+
{ name: 'Alice', id: 1 },
|
|
54
|
+
{ name: 'Bob', id: 2 },
|
|
55
|
+
{ name: 'Charlie', id: 3 },
|
|
56
|
+
]);
|
|
57
|
+
});
|
|
58
|
+
it('should sort objects by numeric key in ascending order', () => {
|
|
59
|
+
const array = [
|
|
60
|
+
{ name: 'Charlie', value: 30 },
|
|
61
|
+
{ name: 'Alice', value: 10 },
|
|
62
|
+
{ name: 'Bob', value: 20 },
|
|
63
|
+
];
|
|
64
|
+
const result = sortArrayByKey(array, 'value');
|
|
65
|
+
expect(result).to.deep.equal([
|
|
66
|
+
{ name: 'Alice', value: 10 },
|
|
67
|
+
{ name: 'Bob', value: 20 },
|
|
68
|
+
{ name: 'Charlie', value: 30 },
|
|
69
|
+
]);
|
|
70
|
+
});
|
|
71
|
+
it('should return an empty array when input is empty', () => {
|
|
72
|
+
const result = sortArrayByKey([], 'any');
|
|
73
|
+
expect(result).to.deep.equal([]);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=arrays.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrays.test.js","sourceRoot":"","sources":["../src/arrays.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE5E,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,UAAU,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErB,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,KAAK,GAAG;gBACZ,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE;gBAC1B,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE;gBACxB,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE;aACvB,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC3B,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE;gBACxB,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE;gBACtB,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,KAAK,GAAG;gBACZ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC5B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;aAC3B,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC3B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC5B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC1B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/async.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return a promise that resolves in ms milliseconds.
|
|
3
|
+
* @param ms Time to wait
|
|
4
|
+
*/
|
|
5
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Wait up to a given amount of time, and throw an error if the promise does not resolve in time.
|
|
8
|
+
* @param promise The promise to timeout on.
|
|
9
|
+
* @param timeoutMs How long to wait for the promise in milliseconds.
|
|
10
|
+
* @param message The error message if a timeout occurs.
|
|
11
|
+
*/
|
|
12
|
+
export declare function timeout<T>(promise: Promise<T>, timeoutMs?: number, message?: string): Promise<T>;
|
|
13
|
+
/**
|
|
14
|
+
* Run a callback with a timeout.
|
|
15
|
+
* @param timeoutMs How long to wait for the promise in milliseconds.
|
|
16
|
+
* @param callback The callback to run.
|
|
17
|
+
* @returns callback return value
|
|
18
|
+
* @throws Error if the timeout is reached before the callback completes
|
|
19
|
+
*/
|
|
20
|
+
export declare function runWithTimeout<T>(timeoutMs: number, callback: () => Promise<T>): Promise<T>;
|
|
21
|
+
/**
|
|
22
|
+
* Executes a fetch request that fails after a timeout via an AbortController.
|
|
23
|
+
* @param resource resource to fetch (e.g URL)
|
|
24
|
+
* @param options fetch call options object
|
|
25
|
+
* @param timeout timeout MS (default 10_000)
|
|
26
|
+
* @returns fetch response
|
|
27
|
+
*/
|
|
28
|
+
export declare function fetchWithTimeout(resource: RequestInfo, options?: RequestInit, timeout?: number): Promise<Response>;
|
|
29
|
+
/**
|
|
30
|
+
* Retries an async function with exponential backoff.
|
|
31
|
+
* Always executes at least once, even if `attempts` is 0 or negative.
|
|
32
|
+
* Stops retrying if `error.isRecoverable` is set to false.
|
|
33
|
+
* @param runner callback to run
|
|
34
|
+
* @param attempts max number of attempts (defaults to 5, minimum 1)
|
|
35
|
+
* @param baseRetryMs base delay between attempts in milliseconds (defaults to 50ms)
|
|
36
|
+
* @returns runner return value
|
|
37
|
+
*/
|
|
38
|
+
export declare function retryAsync<T>(runner: () => Promise<T> | T, attempts?: number, baseRetryMs?: number): Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Run a callback with a timeout, and retry if the callback throws an error.
|
|
41
|
+
* @param runner callback to run
|
|
42
|
+
* @param delayMs base delay between attempts
|
|
43
|
+
* @param maxAttempts maximum number of attempts
|
|
44
|
+
* @returns runner return value
|
|
45
|
+
*/
|
|
46
|
+
export declare function pollAsync<T>(runner: () => Promise<T>, delayMs?: number, maxAttempts?: number | undefined): Promise<T>;
|
|
47
|
+
/**
|
|
48
|
+
* An enhanced Promise.race that returns
|
|
49
|
+
* objects with the promise itself and index
|
|
50
|
+
* instead of just the resolved value.
|
|
51
|
+
*/
|
|
52
|
+
export declare function raceWithContext<T>(promises: Array<Promise<T>>): Promise<{
|
|
53
|
+
resolved: T;
|
|
54
|
+
promise: Promise<T>;
|
|
55
|
+
index: number;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* Map an async function over a list xs with a given concurrency level
|
|
59
|
+
* Forked from https://github.com/celo-org/developer-tooling/blob/0c61e7e02c741fe10ecd1d733a33692d324cdc82/packages/sdk/base/src/async.ts#L128
|
|
60
|
+
*
|
|
61
|
+
* @param concurrency number of `mapFn` concurrent executions
|
|
62
|
+
* @param xs list of value
|
|
63
|
+
* @param mapFn mapping function
|
|
64
|
+
*/
|
|
65
|
+
export declare function concurrentMap<A, B>(concurrency: number, xs: A[], mapFn: (val: A, idx: number) => Promise<B>): Promise<B[]>;
|
|
66
|
+
//# sourceMappingURL=async.d.ts.map
|