@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.
Files changed (210) hide show
  1. package/README.md +20 -0
  2. package/dist/addresses.d.ts +65 -0
  3. package/dist/addresses.d.ts.map +1 -0
  4. package/dist/addresses.js +475 -0
  5. package/dist/addresses.js.map +1 -0
  6. package/dist/addresses.test.d.ts +2 -0
  7. package/dist/addresses.test.d.ts.map +1 -0
  8. package/dist/addresses.test.js +68 -0
  9. package/dist/addresses.test.js.map +1 -0
  10. package/dist/amount.d.ts +70 -0
  11. package/dist/amount.d.ts.map +1 -0
  12. package/dist/amount.js +143 -0
  13. package/dist/amount.js.map +1 -0
  14. package/dist/amount.test.d.ts +2 -0
  15. package/dist/amount.test.d.ts.map +1 -0
  16. package/dist/amount.test.js +113 -0
  17. package/dist/amount.test.js.map +1 -0
  18. package/dist/arrays.d.ts +11 -0
  19. package/dist/arrays.d.ts.map +1 -0
  20. package/dist/arrays.js +26 -0
  21. package/dist/arrays.js.map +1 -0
  22. package/dist/arrays.test.d.ts +2 -0
  23. package/dist/arrays.test.d.ts.map +1 -0
  24. package/dist/arrays.test.js +77 -0
  25. package/dist/arrays.test.js.map +1 -0
  26. package/dist/async.d.ts +66 -0
  27. package/dist/async.d.ts.map +1 -0
  28. package/dist/async.js +146 -0
  29. package/dist/async.js.map +1 -0
  30. package/dist/async.test.d.ts +2 -0
  31. package/dist/async.test.d.ts.map +1 -0
  32. package/dist/async.test.js +204 -0
  33. package/dist/async.test.js.map +1 -0
  34. package/dist/base58.d.ts +5 -0
  35. package/dist/base58.d.ts.map +1 -0
  36. package/dist/base58.js +15 -0
  37. package/dist/base58.js.map +1 -0
  38. package/dist/base58.test.d.ts +2 -0
  39. package/dist/base58.test.d.ts.map +1 -0
  40. package/dist/base58.test.js +31 -0
  41. package/dist/base58.test.js.map +1 -0
  42. package/dist/base64.d.ts +3 -0
  43. package/dist/base64.d.ts.map +1 -0
  44. package/dist/base64.js +25 -0
  45. package/dist/base64.js.map +1 -0
  46. package/dist/base64.test.d.ts +2 -0
  47. package/dist/base64.test.d.ts.map +1 -0
  48. package/dist/base64.test.js +54 -0
  49. package/dist/base64.test.js.map +1 -0
  50. package/dist/big-numbers.d.ts +50 -0
  51. package/dist/big-numbers.d.ts.map +1 -0
  52. package/dist/big-numbers.js +80 -0
  53. package/dist/big-numbers.js.map +1 -0
  54. package/dist/big-numbers.test.d.ts +2 -0
  55. package/dist/big-numbers.test.d.ts.map +1 -0
  56. package/dist/big-numbers.test.js +96 -0
  57. package/dist/big-numbers.test.js.map +1 -0
  58. package/dist/calldata.d.ts +3 -0
  59. package/dist/calldata.d.ts.map +1 -0
  60. package/dist/calldata.js +4 -0
  61. package/dist/calldata.js.map +1 -0
  62. package/dist/checkpoints.d.ts +6 -0
  63. package/dist/checkpoints.d.ts.map +1 -0
  64. package/dist/checkpoints.js +24 -0
  65. package/dist/checkpoints.js.map +1 -0
  66. package/dist/checkpoints.test.d.ts +2 -0
  67. package/dist/checkpoints.test.d.ts.map +1 -0
  68. package/dist/checkpoints.test.js +105 -0
  69. package/dist/checkpoints.test.js.map +1 -0
  70. package/dist/config.d.ts +25 -0
  71. package/dist/config.d.ts.map +1 -0
  72. package/dist/config.js +84 -0
  73. package/dist/config.js.map +1 -0
  74. package/dist/domains.d.ts +2 -0
  75. package/dist/domains.d.ts.map +1 -0
  76. package/dist/domains.js +6 -0
  77. package/dist/domains.js.map +1 -0
  78. package/dist/env.d.ts +4 -0
  79. package/dist/env.d.ts.map +1 -0
  80. package/dist/env.js +17 -0
  81. package/dist/env.js.map +1 -0
  82. package/dist/env.test.d.ts +2 -0
  83. package/dist/env.test.d.ts.map +1 -0
  84. package/dist/env.test.js +16 -0
  85. package/dist/env.test.js.map +1 -0
  86. package/dist/eslint-rules/index.d.ts +157 -0
  87. package/dist/eslint-rules/index.d.ts.map +1 -0
  88. package/dist/eslint-rules/index.js +58 -0
  89. package/dist/eslint-rules/index.js.map +1 -0
  90. package/dist/eslint-rules/no-restricted-imports-from-exports.d.ts +4 -0
  91. package/dist/eslint-rules/no-restricted-imports-from-exports.d.ts.map +1 -0
  92. package/dist/eslint-rules/no-restricted-imports-from-exports.js +141 -0
  93. package/dist/eslint-rules/no-restricted-imports-from-exports.js.map +1 -0
  94. package/dist/eslint-rules/no-restricted-imports-from-exports.test.d.ts +2 -0
  95. package/dist/eslint-rules/no-restricted-imports-from-exports.test.d.ts.map +1 -0
  96. package/dist/eslint-rules/no-restricted-imports-from-exports.test.js +258 -0
  97. package/dist/eslint-rules/no-restricted-imports-from-exports.test.js.map +1 -0
  98. package/dist/eslint-rules/sort-yaml-arrays.d.ts +39 -0
  99. package/dist/eslint-rules/sort-yaml-arrays.d.ts.map +1 -0
  100. package/dist/eslint-rules/sort-yaml-arrays.js +74 -0
  101. package/dist/eslint-rules/sort-yaml-arrays.js.map +1 -0
  102. package/dist/eslint-rules/sort-yaml-arrays.test.d.ts +2 -0
  103. package/dist/eslint-rules/sort-yaml-arrays.test.d.ts.map +1 -0
  104. package/dist/eslint-rules/sort-yaml-arrays.test.js +621 -0
  105. package/dist/eslint-rules/sort-yaml-arrays.test.js.map +1 -0
  106. package/dist/ids.d.ts +20 -0
  107. package/dist/ids.d.ts.map +1 -0
  108. package/dist/ids.js +42 -0
  109. package/dist/ids.js.map +1 -0
  110. package/dist/ids.test.d.ts +2 -0
  111. package/dist/ids.test.d.ts.map +1 -0
  112. package/dist/ids.test.js +39 -0
  113. package/dist/ids.test.js.map +1 -0
  114. package/dist/index.d.ts +30 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +29 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/logging.d.ts +32 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +146 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/logging.test.d.ts +2 -0
  123. package/dist/logging.test.d.ts.map +1 -0
  124. package/dist/logging.test.js +35 -0
  125. package/dist/logging.test.js.map +1 -0
  126. package/dist/math.d.ts +6 -0
  127. package/dist/math.d.ts.map +1 -0
  128. package/dist/math.js +21 -0
  129. package/dist/math.js.map +1 -0
  130. package/dist/math.test.d.ts +2 -0
  131. package/dist/math.test.d.ts.map +1 -0
  132. package/dist/math.test.js +45 -0
  133. package/dist/math.test.js.map +1 -0
  134. package/dist/messages.d.ts +22 -0
  135. package/dist/messages.d.ts.map +1 -0
  136. package/dist/messages.js +64 -0
  137. package/dist/messages.js.map +1 -0
  138. package/dist/multisig.d.ts +4 -0
  139. package/dist/multisig.d.ts.map +1 -0
  140. package/dist/multisig.js +53 -0
  141. package/dist/multisig.js.map +1 -0
  142. package/dist/objects.d.ts +74 -0
  143. package/dist/objects.d.ts.map +1 -0
  144. package/dist/objects.js +331 -0
  145. package/dist/objects.js.map +1 -0
  146. package/dist/objects.test.d.ts +2 -0
  147. package/dist/objects.test.d.ts.map +1 -0
  148. package/dist/objects.test.js +655 -0
  149. package/dist/objects.test.js.map +1 -0
  150. package/dist/result.d.ts +11 -0
  151. package/dist/result.d.ts.map +1 -0
  152. package/dist/result.js +7 -0
  153. package/dist/result.js.map +1 -0
  154. package/dist/sets.d.ts +5 -0
  155. package/dist/sets.d.ts.map +1 -0
  156. package/dist/sets.js +33 -0
  157. package/dist/sets.js.map +1 -0
  158. package/dist/sets.test.d.ts +2 -0
  159. package/dist/sets.test.d.ts.map +1 -0
  160. package/dist/sets.test.js +35 -0
  161. package/dist/sets.test.js.map +1 -0
  162. package/dist/strings.d.ts +11 -0
  163. package/dist/strings.d.ts.map +1 -0
  164. package/dist/strings.js +49 -0
  165. package/dist/strings.js.map +1 -0
  166. package/dist/strings.test.d.ts +2 -0
  167. package/dist/strings.test.d.ts.map +1 -0
  168. package/dist/strings.test.js +42 -0
  169. package/dist/strings.test.js.map +1 -0
  170. package/dist/typeof.d.ts +3 -0
  171. package/dist/typeof.d.ts.map +1 -0
  172. package/dist/typeof.js +7 -0
  173. package/dist/typeof.js.map +1 -0
  174. package/dist/typeof.test.d.ts +2 -0
  175. package/dist/typeof.test.d.ts.map +1 -0
  176. package/dist/typeof.test.js +34 -0
  177. package/dist/typeof.test.js.map +1 -0
  178. package/dist/types.d.ts +111 -0
  179. package/dist/types.d.ts.map +1 -0
  180. package/dist/types.js +23 -0
  181. package/dist/types.js.map +1 -0
  182. package/dist/url.d.ts +4 -0
  183. package/dist/url.d.ts.map +1 -0
  184. package/dist/url.js +34 -0
  185. package/dist/url.js.map +1 -0
  186. package/dist/url.test.d.ts +2 -0
  187. package/dist/url.test.d.ts.map +1 -0
  188. package/dist/url.test.js +29 -0
  189. package/dist/url.test.js.map +1 -0
  190. package/dist/validation.d.ts +2 -0
  191. package/dist/validation.d.ts.map +1 -0
  192. package/dist/validation.js +6 -0
  193. package/dist/validation.js.map +1 -0
  194. package/dist/validation.test.d.ts +2 -0
  195. package/dist/validation.test.d.ts.map +1 -0
  196. package/dist/validation.test.js +11 -0
  197. package/dist/validation.test.js.map +1 -0
  198. package/dist/validator.d.ts +30 -0
  199. package/dist/validator.d.ts.map +1 -0
  200. package/dist/validator.js +76 -0
  201. package/dist/validator.js.map +1 -0
  202. package/dist/yaml.d.ts +22 -0
  203. package/dist/yaml.d.ts.map +1 -0
  204. package/dist/yaml.js +293 -0
  205. package/dist/yaml.js.map +1 -0
  206. package/dist/yaml.test.d.ts +2 -0
  207. package/dist/yaml.test.d.ts.map +1 -0
  208. package/dist/yaml.test.js +519 -0
  209. package/dist/yaml.test.js.map +1 -0
  210. 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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"}
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=amount.test.d.ts.map
@@ -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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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=arrays.test.d.ts.map
@@ -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":"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"}
@@ -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