@recoillink/aleo-sdk 0.0.0-stage → 45.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/LICENSE.md +193 -0
  2. package/README.md +56 -2
  3. package/dist/artifacts.d.ts +14 -0
  4. package/dist/artifacts.d.ts.map +1 -0
  5. package/dist/artifacts.js +23 -0
  6. package/dist/artifacts.js.map +1 -0
  7. package/dist/clients/base.d.ts +27 -0
  8. package/dist/clients/base.d.ts.map +1 -0
  9. package/dist/clients/base.js +105 -0
  10. package/dist/clients/base.js.map +1 -0
  11. package/dist/clients/protocol.d.ts +26 -0
  12. package/dist/clients/protocol.d.ts.map +1 -0
  13. package/dist/clients/protocol.js +104 -0
  14. package/dist/clients/protocol.js.map +1 -0
  15. package/dist/clients/provider.d.ts +42 -0
  16. package/dist/clients/provider.d.ts.map +1 -0
  17. package/dist/clients/provider.js +460 -0
  18. package/dist/clients/provider.js.map +1 -0
  19. package/dist/clients/provider.node.d.ts +7 -0
  20. package/dist/clients/provider.node.d.ts.map +1 -0
  21. package/dist/clients/provider.node.js +20 -0
  22. package/dist/clients/provider.node.js.map +1 -0
  23. package/dist/clients/signer.d.ts +32 -0
  24. package/dist/clients/signer.d.ts.map +1 -0
  25. package/dist/clients/signer.js +137 -0
  26. package/dist/clients/signer.js.map +1 -0
  27. package/dist/constants.d.ts +8 -0
  28. package/dist/constants.d.ts.map +1 -0
  29. package/dist/constants.js +8 -0
  30. package/dist/constants.js.map +1 -0
  31. package/dist/hook/base.d.ts +19 -0
  32. package/dist/hook/base.d.ts.map +1 -0
  33. package/dist/hook/base.js +29 -0
  34. package/dist/hook/base.js.map +1 -0
  35. package/dist/hook/hook-artifact-manager.d.ts +25 -0
  36. package/dist/hook/hook-artifact-manager.d.ts.map +1 -0
  37. package/dist/hook/hook-artifact-manager.js +62 -0
  38. package/dist/hook/hook-artifact-manager.js.map +1 -0
  39. package/dist/hook/hook-query.d.ts +44 -0
  40. package/dist/hook/hook-query.d.ts.map +1 -0
  41. package/dist/hook/hook-query.js +103 -0
  42. package/dist/hook/hook-query.js.map +1 -0
  43. package/dist/hook/hook-tx.d.ts +46 -0
  44. package/dist/hook/hook-tx.d.ts.map +1 -0
  45. package/dist/hook/hook-tx.js +89 -0
  46. package/dist/hook/hook-tx.js.map +1 -0
  47. package/dist/hook/igp-hook.d.ts +21 -0
  48. package/dist/hook/igp-hook.d.ts.map +1 -0
  49. package/dist/hook/igp-hook.js +145 -0
  50. package/dist/hook/igp-hook.js.map +1 -0
  51. package/dist/hook/merkle-tree-hook.d.ts +21 -0
  52. package/dist/hook/merkle-tree-hook.d.ts.map +1 -0
  53. package/dist/hook/merkle-tree-hook.js +58 -0
  54. package/dist/hook/merkle-tree-hook.js.map +1 -0
  55. package/dist/index.d.ts +15 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +14 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/ism/base.d.ts +15 -0
  60. package/dist/ism/base.d.ts.map +1 -0
  61. package/dist/ism/base.js +25 -0
  62. package/dist/ism/base.js.map +1 -0
  63. package/dist/ism/ism-artifact-manager.d.ts +12 -0
  64. package/dist/ism/ism-artifact-manager.d.ts.map +1 -0
  65. package/dist/ism/ism-artifact-manager.js +62 -0
  66. package/dist/ism/ism-artifact-manager.js.map +1 -0
  67. package/dist/ism/ism-query.d.ts +51 -0
  68. package/dist/ism/ism-query.d.ts.map +1 -0
  69. package/dist/ism/ism-query.js +155 -0
  70. package/dist/ism/ism-query.js.map +1 -0
  71. package/dist/ism/ism-tx.d.ts +14 -0
  72. package/dist/ism/ism-tx.d.ts.map +1 -0
  73. package/dist/ism/ism-tx.js +77 -0
  74. package/dist/ism/ism-tx.js.map +1 -0
  75. package/dist/ism/multisig-ism.d.ts +20 -0
  76. package/dist/ism/multisig-ism.d.ts.map +1 -0
  77. package/dist/ism/multisig-ism.js +56 -0
  78. package/dist/ism/multisig-ism.js.map +1 -0
  79. package/dist/ism/routing-ism.d.ts +20 -0
  80. package/dist/ism/routing-ism.d.ts.map +1 -0
  81. package/dist/ism/routing-ism.js +108 -0
  82. package/dist/ism/routing-ism.js.map +1 -0
  83. package/dist/ism/test-ism.d.ts +20 -0
  84. package/dist/ism/test-ism.d.ts.map +1 -0
  85. package/dist/ism/test-ism.js +50 -0
  86. package/dist/ism/test-ism.js.map +1 -0
  87. package/dist/mailbox/mailbox-artifact-manager.d.ts +21 -0
  88. package/dist/mailbox/mailbox-artifact-manager.d.ts.map +1 -0
  89. package/dist/mailbox/mailbox-artifact-manager.js +36 -0
  90. package/dist/mailbox/mailbox-artifact-manager.js.map +1 -0
  91. package/dist/mailbox/mailbox-query.d.ts +12 -0
  92. package/dist/mailbox/mailbox-query.d.ts.map +1 -0
  93. package/dist/mailbox/mailbox-query.js +33 -0
  94. package/dist/mailbox/mailbox-query.js.map +1 -0
  95. package/dist/mailbox/mailbox-tx.d.ts +42 -0
  96. package/dist/mailbox/mailbox-tx.d.ts.map +1 -0
  97. package/dist/mailbox/mailbox-tx.js +94 -0
  98. package/dist/mailbox/mailbox-tx.js.map +1 -0
  99. package/dist/mailbox/mailbox.d.ts +29 -0
  100. package/dist/mailbox/mailbox.d.ts.map +1 -0
  101. package/dist/mailbox/mailbox.js +165 -0
  102. package/dist/mailbox/mailbox.js.map +1 -0
  103. package/dist/programs.d.ts +3 -0
  104. package/dist/programs.d.ts.map +1 -0
  105. package/dist/programs.js +14 -0
  106. package/dist/programs.js.map +1 -0
  107. package/dist/runtime/mainnet.d.ts +3 -0
  108. package/dist/runtime/mainnet.d.ts.map +1 -0
  109. package/dist/runtime/mainnet.js +5 -0
  110. package/dist/runtime/mainnet.js.map +1 -0
  111. package/dist/runtime/provider.d.ts +10 -0
  112. package/dist/runtime/provider.d.ts.map +1 -0
  113. package/dist/runtime/provider.js +18 -0
  114. package/dist/runtime/provider.js.map +1 -0
  115. package/dist/runtime/provider.test.d.ts +2 -0
  116. package/dist/runtime/provider.test.d.ts.map +1 -0
  117. package/dist/runtime/provider.test.js +45 -0
  118. package/dist/runtime/provider.test.js.map +1 -0
  119. package/dist/runtime/testnet.d.ts +3 -0
  120. package/dist/runtime/testnet.d.ts.map +1 -0
  121. package/dist/runtime/testnet.js +8 -0
  122. package/dist/runtime/testnet.js.map +1 -0
  123. package/dist/runtime.d.ts +5 -0
  124. package/dist/runtime.d.ts.map +1 -0
  125. package/dist/runtime.js +4 -0
  126. package/dist/runtime.js.map +1 -0
  127. package/dist/testing/constants.d.ts +58 -0
  128. package/dist/testing/constants.d.ts.map +1 -0
  129. package/dist/testing/constants.js +60 -0
  130. package/dist/testing/constants.js.map +1 -0
  131. package/dist/testing/index.d.ts +4 -0
  132. package/dist/testing/index.d.ts.map +1 -0
  133. package/dist/testing/index.js +7 -0
  134. package/dist/testing/index.js.map +1 -0
  135. package/dist/testing/node.d.ts +10 -0
  136. package/dist/testing/node.d.ts.map +1 -0
  137. package/dist/testing/node.js +39 -0
  138. package/dist/testing/node.js.map +1 -0
  139. package/dist/testing/utils.d.ts +19 -0
  140. package/dist/testing/utils.d.ts.map +1 -0
  141. package/dist/testing/utils.js +23 -0
  142. package/dist/testing/utils.js.map +1 -0
  143. package/dist/tests/5_ism_artifacts.e2e-test.d.ts +2 -0
  144. package/dist/tests/5_ism_artifacts.e2e-test.d.ts.map +1 -0
  145. package/dist/tests/5_ism_artifacts.e2e-test.js +415 -0
  146. package/dist/tests/5_ism_artifacts.e2e-test.js.map +1 -0
  147. package/dist/tests/6_hook_artifacts.e2e-test.d.ts +2 -0
  148. package/dist/tests/6_hook_artifacts.e2e-test.d.ts.map +1 -0
  149. package/dist/tests/6_hook_artifacts.e2e-test.js +306 -0
  150. package/dist/tests/6_hook_artifacts.e2e-test.js.map +1 -0
  151. package/dist/tests/7a_warp_native_artifacts.e2e-test.d.ts +2 -0
  152. package/dist/tests/7a_warp_native_artifacts.e2e-test.d.ts.map +1 -0
  153. package/dist/tests/7a_warp_native_artifacts.e2e-test.js +105 -0
  154. package/dist/tests/7a_warp_native_artifacts.e2e-test.js.map +1 -0
  155. package/dist/tests/7b_warp_collateral_artifacts.e2e-test.d.ts +2 -0
  156. package/dist/tests/7b_warp_collateral_artifacts.e2e-test.d.ts.map +1 -0
  157. package/dist/tests/7b_warp_collateral_artifacts.e2e-test.js +144 -0
  158. package/dist/tests/7b_warp_collateral_artifacts.e2e-test.js.map +1 -0
  159. package/dist/tests/7c_warp_synthetic_artifacts.e2e-test.d.ts +2 -0
  160. package/dist/tests/7c_warp_synthetic_artifacts.e2e-test.d.ts.map +1 -0
  161. package/dist/tests/7c_warp_synthetic_artifacts.e2e-test.js +99 -0
  162. package/dist/tests/7c_warp_synthetic_artifacts.e2e-test.js.map +1 -0
  163. package/dist/tests/8_mailbox_artifacts.e2e-test.d.ts +2 -0
  164. package/dist/tests/8_mailbox_artifacts.e2e-test.d.ts.map +1 -0
  165. package/dist/tests/8_mailbox_artifacts.e2e-test.js +395 -0
  166. package/dist/tests/8_mailbox_artifacts.e2e-test.js.map +1 -0
  167. package/dist/tests/9_validator_announce_artifacts.e2e-test.d.ts +2 -0
  168. package/dist/tests/9_validator_announce_artifacts.e2e-test.d.ts.map +1 -0
  169. package/dist/tests/9_validator_announce_artifacts.e2e-test.js +138 -0
  170. package/dist/tests/9_validator_announce_artifacts.e2e-test.js.map +1 -0
  171. package/dist/tests/e2e-test.setup.d.ts +2 -0
  172. package/dist/tests/e2e-test.setup.d.ts.map +1 -0
  173. package/dist/tests/e2e-test.setup.js +33 -0
  174. package/dist/tests/e2e-test.setup.js.map +1 -0
  175. package/dist/tests/warp-artifact-test-suite.d.ts +34 -0
  176. package/dist/tests/warp-artifact-test-suite.d.ts.map +1 -0
  177. package/dist/tests/warp-artifact-test-suite.js +672 -0
  178. package/dist/tests/warp-artifact-test-suite.js.map +1 -0
  179. package/dist/utils/base-query.d.ts +50 -0
  180. package/dist/utils/base-query.d.ts.map +1 -0
  181. package/dist/utils/base-query.js +72 -0
  182. package/dist/utils/base-query.js.map +1 -0
  183. package/dist/utils/helper.crypto.d.ts +4 -0
  184. package/dist/utils/helper.crypto.d.ts.map +1 -0
  185. package/dist/utils/helper.crypto.js +12 -0
  186. package/dist/utils/helper.crypto.js.map +1 -0
  187. package/dist/utils/helper.d.ts +63 -0
  188. package/dist/utils/helper.d.ts.map +1 -0
  189. package/dist/utils/helper.js +291 -0
  190. package/dist/utils/helper.js.map +1 -0
  191. package/dist/utils/helper.node.d.ts +9 -0
  192. package/dist/utils/helper.node.d.ts.map +1 -0
  193. package/dist/utils/helper.node.js +159 -0
  194. package/dist/utils/helper.node.js.map +1 -0
  195. package/dist/utils/helper.test.d.ts +2 -0
  196. package/dist/utils/helper.test.d.ts.map +1 -0
  197. package/dist/utils/helper.test.js +22 -0
  198. package/dist/utils/helper.test.js.map +1 -0
  199. package/dist/utils/provable.d.ts +4 -0
  200. package/dist/utils/provable.d.ts.map +1 -0
  201. package/dist/utils/provable.js +2 -0
  202. package/dist/utils/provable.js.map +1 -0
  203. package/dist/utils/types.d.ts +104 -0
  204. package/dist/utils/types.d.ts.map +1 -0
  205. package/dist/utils/types.js +64 -0
  206. package/dist/utils/types.js.map +1 -0
  207. package/dist/validator-announce/validator-announce-artifact-manager.d.ts +21 -0
  208. package/dist/validator-announce/validator-announce-artifact-manager.d.ts.map +1 -0
  209. package/dist/validator-announce/validator-announce-artifact-manager.js +27 -0
  210. package/dist/validator-announce/validator-announce-artifact-manager.js.map +1 -0
  211. package/dist/validator-announce/validator-announce-query.d.ts +15 -0
  212. package/dist/validator-announce/validator-announce-query.d.ts.map +1 -0
  213. package/dist/validator-announce/validator-announce-query.js +32 -0
  214. package/dist/validator-announce/validator-announce-query.js.map +1 -0
  215. package/dist/validator-announce/validator-announce-tx.d.ts +11 -0
  216. package/dist/validator-announce/validator-announce-tx.d.ts.map +1 -0
  217. package/dist/validator-announce/validator-announce-tx.js +20 -0
  218. package/dist/validator-announce/validator-announce-tx.js.map +1 -0
  219. package/dist/validator-announce/validator-announce.d.ts +29 -0
  220. package/dist/validator-announce/validator-announce.d.ts.map +1 -0
  221. package/dist/validator-announce/validator-announce.js +71 -0
  222. package/dist/validator-announce/validator-announce.js.map +1 -0
  223. package/dist/warp/collateral-token.d.ts +21 -0
  224. package/dist/warp/collateral-token.d.ts.map +1 -0
  225. package/dist/warp/collateral-token.js +108 -0
  226. package/dist/warp/collateral-token.js.map +1 -0
  227. package/dist/warp/native-token.d.ts +21 -0
  228. package/dist/warp/native-token.d.ts.map +1 -0
  229. package/dist/warp/native-token.js +114 -0
  230. package/dist/warp/native-token.js.map +1 -0
  231. package/dist/warp/provider-query.d.ts +22 -0
  232. package/dist/warp/provider-query.d.ts.map +1 -0
  233. package/dist/warp/provider-query.js +89 -0
  234. package/dist/warp/provider-query.js.map +1 -0
  235. package/dist/warp/synthetic-token.d.ts +21 -0
  236. package/dist/warp/synthetic-token.d.ts.map +1 -0
  237. package/dist/warp/synthetic-token.js +108 -0
  238. package/dist/warp/synthetic-token.js.map +1 -0
  239. package/dist/warp/warp-artifact-manager.d.ts +15 -0
  240. package/dist/warp/warp-artifact-manager.d.ts.map +1 -0
  241. package/dist/warp/warp-artifact-manager.js +48 -0
  242. package/dist/warp/warp-artifact-manager.js.map +1 -0
  243. package/dist/warp/warp-query.d.ts +76 -0
  244. package/dist/warp/warp-query.d.ts.map +1 -0
  245. package/dist/warp/warp-query.js +321 -0
  246. package/dist/warp/warp-query.js.map +1 -0
  247. package/dist/warp/warp-query.test.d.ts +2 -0
  248. package/dist/warp/warp-query.test.d.ts.map +1 -0
  249. package/dist/warp/warp-query.test.js +270 -0
  250. package/dist/warp/warp-query.test.js.map +1 -0
  251. package/dist/warp/warp-tx.d.ts +58 -0
  252. package/dist/warp/warp-tx.d.ts.map +1 -0
  253. package/dist/warp/warp-tx.js +229 -0
  254. package/dist/warp/warp-tx.js.map +1 -0
  255. package/dist/warp/warp-tx.test.d.ts +2 -0
  256. package/dist/warp/warp-tx.test.d.ts.map +1 -0
  257. package/dist/warp/warp-tx.test.js +44 -0
  258. package/dist/warp/warp-tx.test.js.map +1 -0
  259. package/package.json +91 -3
@@ -0,0 +1,270 @@
1
+ import { AleoNetworkClient } from '@provablehq/sdk/testnet.js';
2
+ import chai, { expect } from 'chai';
3
+ import chaiAsPromised from 'chai-as-promised';
4
+ import { isArc20ProgramId, isV2WarpToken, stringToU128, } from '../utils/helper.js';
5
+ import { TokenRegistryEntryNotFoundError, getArc20ProgramId, getArc20TokenMetadata, localRemoteDecimalsToScale, nativeScaleExponentToMultiplier, parseAleoUint, parseViewFunctionOutputs, resolveTokenMetadata, } from './warp-query.js';
6
+ chai.use(chaiAsPromised);
7
+ describe('parseAleoUint', () => {
8
+ it('parses a raw Aleo uint literal to a bigint', () => {
9
+ expect(parseAleoUint('1000000u128')).to.equal(1000000n);
10
+ expect(parseAleoUint('6u8')).to.equal(6n);
11
+ });
12
+ it('throws on a non-numeric literal', () => {
13
+ expect(() => parseAleoUint('not-a-number')).to.throw();
14
+ });
15
+ });
16
+ describe('localRemoteDecimalsToScale', () => {
17
+ it('returns undefined when local and remote decimals match (no scaling)', () => {
18
+ expect(localRemoteDecimalsToScale(6, 6)).to.equal(undefined);
19
+ });
20
+ it('returns undefined when either side is unavailable', () => {
21
+ expect(localRemoteDecimalsToScale(undefined, 18)).to.equal(undefined);
22
+ expect(localRemoteDecimalsToScale(6, undefined)).to.equal(undefined);
23
+ });
24
+ it('scales up when remote decimals exceed local decimals', () => {
25
+ expect(localRemoteDecimalsToScale(6, 18)).to.equal(1_000_000_000_000);
26
+ });
27
+ it('scales down when remote decimals are fewer than local decimals', () => {
28
+ expect(localRemoteDecimalsToScale(18, 6)).to.equal(1e-12);
29
+ });
30
+ });
31
+ describe('nativeScaleExponentToMultiplier', () => {
32
+ it('returns undefined for an identity exponent (0)', () => {
33
+ expect(nativeScaleExponentToMultiplier(0)).to.equal(undefined);
34
+ });
35
+ it('returns undefined when the exponent is unavailable', () => {
36
+ expect(nativeScaleExponentToMultiplier(undefined)).to.equal(undefined);
37
+ });
38
+ it('converts a positive exponent to the equivalent power-of-10 multiplier', () => {
39
+ expect(nativeScaleExponentToMultiplier(6)).to.equal(1_000_000);
40
+ });
41
+ });
42
+ describe('parseViewFunctionOutputs', () => {
43
+ it('returns the first output when the shape is a non-empty string array', () => {
44
+ expect(parseViewFunctionOutputs(['6u8'], 'foo.aleo', 'decimals')).to.equal('6u8');
45
+ });
46
+ it('throws when the response is not an array', () => {
47
+ expect(() => parseViewFunctionOutputs({ foo: 'bar' }, 'foo.aleo', 'decimals')).to.throw();
48
+ });
49
+ it('throws when the array is empty', () => {
50
+ expect(() => parseViewFunctionOutputs([], 'foo.aleo', 'decimals')).to.throw();
51
+ });
52
+ it('throws when the first element is not a string', () => {
53
+ expect(() => parseViewFunctionOutputs([123], 'foo.aleo', 'decimals')).to.throw();
54
+ });
55
+ });
56
+ describe('isV2WarpToken / isArc20ProgramId', () => {
57
+ it('detects v2 warp token program ids by suffix', () => {
58
+ expect(isV2WarpToken('hyp_warp_token_usdc_v2.aleo')).to.equal(true);
59
+ expect(isV2WarpToken('hyp_warp_token_usdc.aleo')).to.equal(false);
60
+ });
61
+ it('detects arc20 program ids', () => {
62
+ expect(isArc20ProgramId('test_arc20_usdc.aleo')).to.equal(true);
63
+ expect(isArc20ProgramId('not-a-program-id')).to.equal(false);
64
+ });
65
+ });
66
+ describe('getArc20ProgramId', () => {
67
+ function clientWithImports(imports) {
68
+ const client = new AleoNetworkClient('http://localhost:3030');
69
+ client.getProgramImportNames = async () => imports;
70
+ return client;
71
+ }
72
+ it('resolves an ARC-20 token import', async () => {
73
+ const aleoClient = clientWithImports([
74
+ 'credits.aleo',
75
+ 'test_arc20_usdc.aleo',
76
+ 'arc20_multisig_core.aleo',
77
+ ]);
78
+ expect(await getArc20ProgramId(aleoClient, 'hyp_warp_token_usdc_v2.aleo')).to.equal('test_arc20_usdc.aleo');
79
+ });
80
+ it('resolves an ARC-22 token import after its helper imports', async () => {
81
+ const aleoClient = clientWithImports([
82
+ 'credits.aleo',
83
+ 'shield_arc22_freezelist.aleo',
84
+ 'shield_arc22_multisig_core.aleo',
85
+ 'shield_arc22_usdg.aleo',
86
+ ]);
87
+ expect(await getArc20ProgramId(aleoClient, 'hyp_warp_token_usdg_v2.aleo')).to.equal('shield_arc22_usdg.aleo');
88
+ });
89
+ it('resolves an ARC-22 token import before its helper imports', async () => {
90
+ const aleoClient = clientWithImports([
91
+ 'credits.aleo',
92
+ 'shield_arc22_bat.aleo',
93
+ 'shield_arc22_freezelist.aleo',
94
+ 'shield_arc22_multisig_core.aleo',
95
+ ]);
96
+ expect(await getArc20ProgramId(aleoClient, 'hyp_warp_token_bat_v2.aleo')).to.equal('shield_arc22_bat.aleo');
97
+ });
98
+ it('rejects v2 programs without an ARC token import', async () => {
99
+ const aleoClient = clientWithImports(['credits.aleo', 'hyp_mailbox.aleo']);
100
+ await expect(getArc20ProgramId(aleoClient, 'hyp_warp_token_invalid_v2.aleo')).to.be.rejectedWith('Expected exactly one ARC-20 or ARC-22 token import in program hyp_warp_token_invalid_v2.aleo, found 0: none');
101
+ });
102
+ it('rejects ambiguous ARC token imports and lists the candidates', async () => {
103
+ const aleoClient = clientWithImports([
104
+ 'shield_arc22_bat.aleo',
105
+ 'shield_arc22_usdg.aleo',
106
+ ]);
107
+ await expect(getArc20ProgramId(aleoClient, 'hyp_warp_token_invalid_v2.aleo')).to.be.rejectedWith('found 2: shield_arc22_bat.aleo, shield_arc22_usdg.aleo');
108
+ });
109
+ });
110
+ describe('getArc20TokenMetadata', () => {
111
+ const originalFetch = globalThis.fetch;
112
+ afterEach(() => {
113
+ globalThis.fetch = originalFetch;
114
+ });
115
+ function stubViewFunctionResponses(outputsByView) {
116
+ globalThis.fetch = (async (url) => {
117
+ const viewName = url.split('/').pop() ?? '';
118
+ const output = outputsByView[viewName];
119
+ return {
120
+ ok: output !== undefined,
121
+ status: output !== undefined ? 200 : 404,
122
+ json: async () => [output],
123
+ };
124
+ });
125
+ }
126
+ it('parses name, symbol, and decimals from view function responses', async () => {
127
+ stubViewFunctionResponses({
128
+ name: "'USDC'",
129
+ symbol: "'USDC'",
130
+ decimals: '6u8',
131
+ });
132
+ const aleoClient = new AleoNetworkClient('http://localhost:3030');
133
+ const metadata = await getArc20TokenMetadata(aleoClient, 'test_arc20_usdc.aleo');
134
+ expect(metadata).to.deep.equal({
135
+ name: 'USDC',
136
+ symbol: 'USDC',
137
+ decimals: 6,
138
+ });
139
+ });
140
+ it('throws if the decimals view returns a non-numeric value', async () => {
141
+ stubViewFunctionResponses({
142
+ name: "'USDC'",
143
+ symbol: "'USDC'",
144
+ decimals: "'not-a-number'",
145
+ });
146
+ const aleoClient = new AleoNetworkClient('http://localhost:3030');
147
+ await expect(getArc20TokenMetadata(aleoClient, 'test_arc20_usdc.aleo')).to
148
+ .be.rejected;
149
+ });
150
+ });
151
+ describe('resolveTokenMetadata', () => {
152
+ const V1_PROGRAM_ID = 'hyp_warp_token_usad.aleo';
153
+ const V2_PROGRAM_ID = 'hyp_warp_token_usdc_v2.aleo';
154
+ const TOKEN_ID = '123field';
155
+ // Keep the bounded-retry behaviour under test but collapse the exponential
156
+ // backoff to zero so miss/exhaustion paths don't take ~51s in the suite.
157
+ const RETRY_ATTEMPTS = 3;
158
+ const RETRY_DELAY_MS = 0;
159
+ // A token_registry.aleo `registered_tokens` TokenMetadata value only needs the
160
+ // name/symbol/decimals fields that getTokenMetadata actually reads.
161
+ function registeredTokenPlaintext(name, symbol, decimals) {
162
+ return `{\n name: ${stringToU128(name)}u128,\n symbol: ${stringToU128(symbol)}u128,\n decimals: ${decimals}u8\n}`;
163
+ }
164
+ function clientWithMappingValue(value) {
165
+ const client = new AleoNetworkClient('http://localhost:3030');
166
+ client.getProgramMappingValue = async () => value;
167
+ return client;
168
+ }
169
+ it('falls back to local_decimals with empty name/symbol when a v1 miss persists across retries', async () => {
170
+ // An empty mapping value that survives the bounded retries is a genuine
171
+ // registry miss; getTokenMetadata rethrows the sentinel, which
172
+ // resolveTokenMetadata tolerates.
173
+ const aleoClient = clientWithMappingValue('');
174
+ const metadata = await resolveTokenMetadata(aleoClient, V1_PROGRAM_ID, TOKEN_ID, 9, RETRY_ATTEMPTS, RETRY_DELAY_MS);
175
+ expect(metadata).to.deep.equal({ name: '', symbol: '', decimals: 9 });
176
+ });
177
+ it('retries a transient empty mapping and prefers registry metadata once it appears', async () => {
178
+ // A just-registered mapping can read empty before it finalizes/indexes.
179
+ // The bounded retry must ride that out and use the authoritative metadata
180
+ // rather than immediately taking the empty-name/symbol legacy fallback.
181
+ let call = 0;
182
+ const aleoClient = new AleoNetworkClient('http://localhost:3030');
183
+ aleoClient.getProgramMappingValue = async () => {
184
+ call += 1;
185
+ return call === 1 ? '' : registeredTokenPlaintext('LATE', 'LATE', 7);
186
+ };
187
+ const metadata = await resolveTokenMetadata(aleoClient, V1_PROGRAM_ID, TOKEN_ID, 9, RETRY_ATTEMPTS, RETRY_DELAY_MS);
188
+ expect(call).to.be.greaterThan(1);
189
+ expect(metadata).to.deep.equal({
190
+ name: 'LATE',
191
+ symbol: 'LATE',
192
+ decimals: 7,
193
+ });
194
+ });
195
+ it('prefers registry metadata over local_decimals when the v1 entry exists', async () => {
196
+ const aleoClient = clientWithMappingValue(registeredTokenPlaintext('MYTKN', 'MYT', 8));
197
+ const metadata = await resolveTokenMetadata(aleoClient, V1_PROGRAM_ID, TOKEN_ID, 9, RETRY_ATTEMPTS, RETRY_DELAY_MS);
198
+ expect(metadata).to.deep.equal({
199
+ name: 'MYTKN',
200
+ symbol: 'MYT',
201
+ decimals: 8,
202
+ });
203
+ });
204
+ it('throws when the v1 entry is missing and local_decimals is also unavailable', async () => {
205
+ const aleoClient = clientWithMappingValue('');
206
+ await expect(resolveTokenMetadata(aleoClient, V1_PROGRAM_ID, TOKEN_ID, undefined, RETRY_ATTEMPTS, RETRY_DELAY_MS)).to.be.rejectedWith(/Unable to resolve decimals/);
207
+ });
208
+ it('propagates non-sentinel v1 read failures (transport) instead of masking them', async () => {
209
+ const aleoClient = new AleoNetworkClient('http://localhost:3030');
210
+ // A transport error is retried (recoverable) then propagates; the point
211
+ // under test is that it is not swallowed by resolveTokenMetadata as a miss.
212
+ aleoClient.getProgramMappingValue = async () => {
213
+ throw new Error('RPC transport error');
214
+ };
215
+ const result = resolveTokenMetadata(aleoClient, V1_PROGRAM_ID, TOKEN_ID, 9, RETRY_ATTEMPTS, RETRY_DELAY_MS);
216
+ await expect(result).to.be.rejectedWith('RPC transport error');
217
+ // The sentinel is the only tolerated failure; a transport error is not it.
218
+ await result.catch((err) => {
219
+ expect(err).to.not.be.instanceOf(TokenRegistryEntryNotFoundError);
220
+ });
221
+ });
222
+ it('propagates v1 decode failures (unparseable registry value) instead of masking them', async () => {
223
+ const aleoClient = clientWithMappingValue('not-a-valid-plaintext');
224
+ await expect(resolveTokenMetadata(aleoClient, V1_PROGRAM_ID, TOKEN_ID, 9, RETRY_ATTEMPTS, RETRY_DELAY_MS)).to.be.rejected;
225
+ });
226
+ it('resolves v2 ARC-22 metadata when helper imports precede the token', async () => {
227
+ const originalFetch = globalThis.fetch;
228
+ const aleoClient = new AleoNetworkClient('http://localhost:3030');
229
+ aleoClient.getProgramImportNames = async () => [
230
+ 'credits.aleo',
231
+ 'shield_arc22_freezelist.aleo',
232
+ 'shield_arc22_multisig_core.aleo',
233
+ 'shield_arc22_usdg.aleo',
234
+ ];
235
+ globalThis.fetch = (async (url) => {
236
+ const outputByView = {
237
+ name: "'Global_Dollar'",
238
+ symbol: "'USDG'",
239
+ decimals: '6u8',
240
+ };
241
+ const output = outputByView[url.split('/').pop() ?? ''];
242
+ return {
243
+ ok: output !== undefined,
244
+ status: output !== undefined ? 200 : 404,
245
+ json: async () => [output],
246
+ };
247
+ });
248
+ try {
249
+ expect(await resolveTokenMetadata(aleoClient, 'hyp_warp_token_usdg_v2.aleo', TOKEN_ID, 6, RETRY_ATTEMPTS, RETRY_DELAY_MS)).to.deep.equal({
250
+ name: 'Global_Dollar',
251
+ symbol: 'USDG',
252
+ decimals: 6,
253
+ });
254
+ }
255
+ finally {
256
+ globalThis.fetch = originalFetch;
257
+ }
258
+ });
259
+ it('propagates v2 ARC-20 read failures instead of falling back', async () => {
260
+ const aleoClient = new AleoNetworkClient('http://localhost:3030');
261
+ // No arc20 import present, so getArc20ProgramId cannot resolve the token
262
+ // program and throws — v2 has no fallback path.
263
+ aleoClient.getProgramImportNames = async () => [
264
+ 'credits.aleo',
265
+ 'mailbox.aleo',
266
+ ];
267
+ await expect(resolveTokenMetadata(aleoClient, V2_PROGRAM_ID, TOKEN_ID, 6, RETRY_ATTEMPTS, RETRY_DELAY_MS)).to.be.rejected;
268
+ });
269
+ });
270
+ //# sourceMappingURL=warp-query.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-query.test.js","sourceRoot":"","sources":["../../src/warp/warp-query.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { ArtifactDeployed } from '@recoillink/provider-sdk/artifact';
2
+ import { type DeployedWarpAddress, type RawWarpArtifactConfig } from '@recoillink/provider-sdk/warp';
3
+ import type { AnyAleoNetworkClient } from '../clients/base.js';
4
+ import type { AleoTransaction, AnnotatedAleoTransaction } from '../utils/types.js';
5
+ /**
6
+ * Create transaction for initializing a native token
7
+ */
8
+ export declare function getCreateNativeTokenTx(tokenProgramId: string): AleoTransaction;
9
+ /**
10
+ * Create transaction for initializing a collateral token
11
+ */
12
+ export declare function getCreateCollateralTokenTx(aleoClient: AnyAleoNetworkClient, tokenProgramId: string, collateralDenom: string): Promise<AleoTransaction>;
13
+ /**
14
+ * Create transaction for initializing a synthetic token
15
+ */
16
+ export declare function getCreateSyntheticTokenTx(tokenProgramId: string, name: string, denom: string, decimals: number, remoteDecimals?: number): AleoTransaction;
17
+ /** Derives Aleo's remote decimals from the configured power-of-ten scale. */
18
+ export declare function scaleToRemoteDecimals(localDecimals: number, scale?: number): number;
19
+ /**
20
+ * Create transaction for setting token owner
21
+ */
22
+ export declare function getSetTokenOwnerTx(tokenAddress: string, newOwner: string): AleoTransaction;
23
+ /**
24
+ * Create transaction for setting token ISM
25
+ */
26
+ export declare function getSetTokenIsmTx(tokenAddress: string, ismAddress?: string): AleoTransaction;
27
+ /**
28
+ * Create transaction for setting token hook
29
+ */
30
+ export declare function getSetTokenHookTx(tokenAddress: string, hookAddress?: string): AleoTransaction;
31
+ /**
32
+ * Create transaction for enrolling a remote router
33
+ */
34
+ export declare function getEnrollRemoteRouterTx(tokenAddress: string, domainId: number, routerAddress: string, gas: string): AleoTransaction;
35
+ /**
36
+ * Create transaction for unenrolling a remote router
37
+ */
38
+ export declare function getUnenrollRemoteRouterTx(tokenAddress: string, domainId: number): AleoTransaction;
39
+ /**
40
+ * Generate post-deployment transactions for ISM setup and router enrollment.
41
+ * Used after token deployment to configure ISM and enroll remote routers.
42
+ *
43
+ * @param tokenAddress The deployed token address
44
+ * @param config The warp token configuration
45
+ * @returns Array of transactions to execute in order
46
+ */
47
+ export declare function getPostDeploymentUpdateTxs<TConfig extends RawWarpArtifactConfig>(tokenAddress: string, config: TConfig): AleoTransaction[];
48
+ /**
49
+ * Generates update transactions for a warp token by comparing current on-chain state
50
+ * with desired configuration. Returns transactions for ISM updates, router enrollment/unenrollment,
51
+ * and ownership transfer (always last).
52
+ *
53
+ * @param expectedArtifactState The desired warp token configuration with deployment address
54
+ * @param currentArtifactState The current on-chain warp token state
55
+ * @returns Array of transactions to execute in order
56
+ */
57
+ export declare function getWarpTokenUpdateTxs<TConfig extends RawWarpArtifactConfig>(expectedArtifactState: ArtifactDeployed<TConfig, DeployedWarpAddress>, currentArtifactState: ArtifactDeployed<TConfig, DeployedWarpAddress>): AnnotatedAleoTransaction[];
58
+ //# sourceMappingURL=warp-tx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-tx.d.ts","sourceRoot":"","sources":["../../src/warp/warp-tx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,+BAA+B,CAAC;AAUvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS/D,OAAO,KAAK,EACV,eAAe,EACf,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAS3B;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,MAAM,GACrB,eAAe,CAQjB;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,oBAAoB,EAChC,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC,CAqB1B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,cAAc,SAAW,GACxB,eAAe,CAcjB;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,KAAK,SAAI,GACR,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,eAAe,CAQjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,CAcjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,eAAe,CAajB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACV,eAAe,CAcjB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,eAAe,CAQjB;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,SAAS,qBAAqB,EACrC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe,EAAE,CA4C1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,qBAAqB,EACzE,qBAAqB,EAAE,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,EACrE,oBAAoB,EAAE,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,GACnE,wBAAwB,EAAE,CAuE5B"}
@@ -0,0 +1,229 @@
1
+ import { computeRemoteRoutersUpdates, } from '@recoillink/provider-sdk/warp';
2
+ import { assert, eqAddressAleo, eqOptionalAddress, isNullish, isZeroishAddress, strip0x, } from '@recoillink/utils';
3
+ import { ALEO_NULL_ADDRESS, arrayToPlaintext, fillArray, fromAleoAddress, programIdToPlaintext, stringToU128, } from '../utils/helper.js';
4
+ import { getTokenMetadata } from './warp-query.js';
5
+ function withErrorContext(context, error) {
6
+ const message = error instanceof Error ? error.message : String(error);
7
+ return new Error(`${context}: ${message}`);
8
+ }
9
+ /**
10
+ * Create transaction for initializing a native token
11
+ */
12
+ export function getCreateNativeTokenTx(tokenProgramId) {
13
+ return {
14
+ programName: tokenProgramId,
15
+ functionName: 'init',
16
+ priorityFee: 0,
17
+ privateFee: false,
18
+ inputs: [programIdToPlaintext(tokenProgramId), `0u8`],
19
+ };
20
+ }
21
+ /**
22
+ * Create transaction for initializing a collateral token
23
+ */
24
+ export async function getCreateCollateralTokenTx(aleoClient, tokenProgramId, collateralDenom) {
25
+ const metadata = await getTokenMetadata(aleoClient, collateralDenom).catch((error) => {
26
+ throw withErrorContext(`Failed to query collateral token metadata (tokenProgramId=${tokenProgramId}, collateralDenom=${collateralDenom})`, error);
27
+ });
28
+ return {
29
+ programName: tokenProgramId,
30
+ functionName: 'init',
31
+ priorityFee: 0,
32
+ privateFee: false,
33
+ inputs: [
34
+ programIdToPlaintext(tokenProgramId),
35
+ collateralDenom,
36
+ `${metadata.decimals}u8`,
37
+ ],
38
+ };
39
+ }
40
+ /**
41
+ * Create transaction for initializing a synthetic token
42
+ */
43
+ export function getCreateSyntheticTokenTx(tokenProgramId, name, denom, decimals, remoteDecimals = decimals) {
44
+ return {
45
+ programName: tokenProgramId,
46
+ functionName: 'init',
47
+ priorityFee: 0,
48
+ privateFee: false,
49
+ inputs: [
50
+ programIdToPlaintext(tokenProgramId),
51
+ `${stringToU128(name).toString()}u128`,
52
+ `${stringToU128(denom).toString()}u128`,
53
+ `${decimals}u8`,
54
+ `${remoteDecimals}u8`,
55
+ ],
56
+ };
57
+ }
58
+ /** Derives Aleo's remote decimals from the configured power-of-ten scale. */
59
+ export function scaleToRemoteDecimals(localDecimals, scale = 1) {
60
+ const exponent = Math.round(Math.log10(scale));
61
+ assert(Number.isFinite(scale) && scale > 0 && Number(`1e${exponent}`) === scale, `scale must be a positive power of 10, got ${scale}`);
62
+ assert(Math.abs(exponent) <= 18, 'Aleo local and remote decimals must differ by at most 18');
63
+ const remoteDecimals = localDecimals + exponent;
64
+ assert(Number.isInteger(localDecimals) &&
65
+ localDecimals >= 0 &&
66
+ localDecimals <= 255 &&
67
+ remoteDecimals >= 0 &&
68
+ remoteDecimals <= 255, `Aleo local and remote decimals must be integers in [0, 255], got ${localDecimals} and ${remoteDecimals}`);
69
+ return remoteDecimals;
70
+ }
71
+ /**
72
+ * Create transaction for setting token owner
73
+ */
74
+ export function getSetTokenOwnerTx(tokenAddress, newOwner) {
75
+ return {
76
+ programName: fromAleoAddress(tokenAddress).programId,
77
+ functionName: 'set_owner',
78
+ priorityFee: 0,
79
+ privateFee: false,
80
+ inputs: [newOwner],
81
+ };
82
+ }
83
+ /**
84
+ * Create transaction for setting token ISM
85
+ */
86
+ export function getSetTokenIsmTx(tokenAddress, ismAddress) {
87
+ // Handle zero address - use Aleo null address to unset ISM
88
+ const ism = !isNullish(ismAddress) && !isZeroishAddress(ismAddress)
89
+ ? fromAleoAddress(ismAddress).address
90
+ : ALEO_NULL_ADDRESS;
91
+ return {
92
+ programName: fromAleoAddress(tokenAddress).programId,
93
+ functionName: 'set_custom_ism',
94
+ priorityFee: 0,
95
+ privateFee: false,
96
+ inputs: [ism],
97
+ };
98
+ }
99
+ /**
100
+ * Create transaction for setting token hook
101
+ */
102
+ export function getSetTokenHookTx(tokenAddress, hookAddress) {
103
+ const hook = !isNullish(hookAddress) && !isZeroishAddress(hookAddress)
104
+ ? fromAleoAddress(hookAddress).address
105
+ : ALEO_NULL_ADDRESS;
106
+ return {
107
+ programName: fromAleoAddress(tokenAddress).programId,
108
+ functionName: 'set_custom_hook',
109
+ priorityFee: 0,
110
+ privateFee: false,
111
+ inputs: [hook],
112
+ };
113
+ }
114
+ /**
115
+ * Create transaction for enrolling a remote router
116
+ */
117
+ export function getEnrollRemoteRouterTx(tokenAddress, domainId, routerAddress, gas) {
118
+ const bytes = fillArray([...Buffer.from(strip0x(routerAddress), 'hex')].map((b) => `${b}u8`), 32, `0u8`);
119
+ return {
120
+ programName: fromAleoAddress(tokenAddress).programId,
121
+ functionName: 'enroll_remote_router',
122
+ priorityFee: 0,
123
+ privateFee: false,
124
+ inputs: [`${domainId}u32`, arrayToPlaintext(bytes), `${gas}u128`],
125
+ };
126
+ }
127
+ /**
128
+ * Create transaction for unenrolling a remote router
129
+ */
130
+ export function getUnenrollRemoteRouterTx(tokenAddress, domainId) {
131
+ return {
132
+ programName: fromAleoAddress(tokenAddress).programId,
133
+ functionName: 'unroll_remote_router',
134
+ priorityFee: 0,
135
+ privateFee: false,
136
+ inputs: [`${domainId}u32`],
137
+ };
138
+ }
139
+ /**
140
+ * Generate post-deployment transactions for ISM setup and router enrollment.
141
+ * Used after token deployment to configure ISM and enroll remote routers.
142
+ *
143
+ * @param tokenAddress The deployed token address
144
+ * @param config The warp token configuration
145
+ * @returns Array of transactions to execute in order
146
+ */
147
+ export function getPostDeploymentUpdateTxs(tokenAddress, config) {
148
+ const txs = [];
149
+ // Set ISM if configured
150
+ if (config.interchainSecurityModule) {
151
+ const setIsmTx = getSetTokenIsmTx(tokenAddress, config.interchainSecurityModule.deployed.address);
152
+ txs.push(setIsmTx);
153
+ }
154
+ // Set Hook if configured
155
+ if (config.hook) {
156
+ const setHookTx = getSetTokenHookTx(tokenAddress, config.hook.deployed.address);
157
+ txs.push(setHookTx);
158
+ }
159
+ const routerDiff = computeRemoteRoutersUpdates({ destinationGas: {}, remoteRouters: {} }, config, eqAddressAleo);
160
+ // Enroll remote routers
161
+ for (const { domainId, routerAddress, gas } of routerDiff.toEnroll) {
162
+ const enrollTx = getEnrollRemoteRouterTx(tokenAddress, domainId, routerAddress, gas);
163
+ txs.push(enrollTx);
164
+ }
165
+ // We don't transfer ownership here because after deployment the token needs to be
166
+ // enrolled with the other tokens deployed and only the owner can do that
167
+ return txs;
168
+ }
169
+ /**
170
+ * Generates update transactions for a warp token by comparing current on-chain state
171
+ * with desired configuration. Returns transactions for ISM updates, router enrollment/unenrollment,
172
+ * and ownership transfer (always last).
173
+ *
174
+ * @param expectedArtifactState The desired warp token configuration with deployment address
175
+ * @param currentArtifactState The current on-chain warp token state
176
+ * @returns Array of transactions to execute in order
177
+ */
178
+ export function getWarpTokenUpdateTxs(expectedArtifactState, currentArtifactState) {
179
+ const { config: expectedConfig, deployed } = expectedArtifactState;
180
+ const { config: currentConfig } = currentArtifactState;
181
+ const updateTxs = [];
182
+ // Update ISM if changed
183
+ const currentIsm = currentConfig.interchainSecurityModule?.deployed.address;
184
+ const newIsm = expectedConfig.interchainSecurityModule?.deployed.address;
185
+ if (!eqOptionalAddress(currentIsm, newIsm, eqAddressAleo)) {
186
+ const setIsmTx = getSetTokenIsmTx(deployed.address, newIsm);
187
+ updateTxs.push({
188
+ annotation: 'Updating token ISM',
189
+ ...setIsmTx,
190
+ });
191
+ }
192
+ // Update hook if changed
193
+ const currentHook = currentConfig.hook?.deployed.address;
194
+ const newHook = expectedConfig.hook?.deployed.address;
195
+ if (!eqOptionalAddress(currentHook, newHook, eqAddressAleo)) {
196
+ const setHookTx = getSetTokenHookTx(deployed.address, newHook);
197
+ updateTxs.push({
198
+ annotation: 'Updating token Hook',
199
+ ...setHookTx,
200
+ });
201
+ }
202
+ const routerDiff = computeRemoteRoutersUpdates(currentConfig, expectedConfig, eqAddressAleo);
203
+ // Unenroll removed routers
204
+ for (const domainId of routerDiff.toUnenroll) {
205
+ const unenrollTx = getUnenrollRemoteRouterTx(deployed.address, domainId);
206
+ updateTxs.push({
207
+ annotation: `Unenrolling router for domain ${domainId}`,
208
+ ...unenrollTx,
209
+ });
210
+ }
211
+ // Enroll or update routers
212
+ for (const { domainId, routerAddress, gas } of routerDiff.toEnroll) {
213
+ const enrollTx = getEnrollRemoteRouterTx(deployed.address, domainId, routerAddress, gas);
214
+ updateTxs.push({
215
+ annotation: `Enrolling/updating router for domain ${domainId}`,
216
+ ...enrollTx,
217
+ });
218
+ }
219
+ // Owner transfer must be last transaction as the current owner executes all updates
220
+ if (!eqAddressAleo(currentConfig.owner, expectedConfig.owner)) {
221
+ const setOwnerTx = getSetTokenOwnerTx(deployed.address, expectedConfig.owner);
222
+ updateTxs.push({
223
+ annotation: 'Setting new token owner',
224
+ ...setOwnerTx,
225
+ });
226
+ }
227
+ return updateTxs;
228
+ }
229
+ //# sourceMappingURL=warp-tx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-tx.js","sourceRoot":"","sources":["../../src/warp/warp-tx.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,GAG5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,OAAO,GACR,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAc;IACvD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,cAAsB;IAEtB,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC;KACtD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,UAAgC,EAChC,cAAsB,EACtB,eAAuB;IAEvB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,KAAK,CACxE,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,gBAAgB,CACpB,6DAA6D,cAAc,qBAAqB,eAAe,GAAG,EAClH,KAAK,CACN,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE;YACN,oBAAoB,CAAC,cAAc,CAAC;YACpC,eAAe;YACf,GAAG,QAAQ,CAAC,QAAQ,IAAI;SACzB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,cAAsB,EACtB,IAAY,EACZ,KAAa,EACb,QAAgB,EAChB,cAAc,GAAG,QAAQ;IAEzB,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE;YACN,oBAAoB,CAAC,cAAc,CAAC;YACpC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM;YACtC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM;YACvC,GAAG,QAAQ,IAAI;YACf,GAAG,cAAc,IAAI;SACtB;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CACnC,aAAqB,EACrB,KAAK,GAAG,CAAC;IAET,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,MAAM,CACJ,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC,KAAK,KAAK,EACxE,6CAA6C,KAAK,EAAE,CACrD,CAAC;IACF,MAAM,CACJ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EACxB,0DAA0D,CAC3D,CAAC;IACF,MAAM,cAAc,GAAG,aAAa,GAAG,QAAQ,CAAC;IAChD,MAAM,CACJ,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;QAC7B,aAAa,IAAI,CAAC;QAClB,aAAa,IAAI,GAAG;QACpB,cAAc,IAAI,CAAC;QACnB,cAAc,IAAI,GAAG,EACvB,oEAAoE,aAAa,QAAQ,cAAc,EAAE,CAC1G,CAAC;IACF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,QAAgB;IAEhB,OAAO;QACL,WAAW,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,SAAS;QACpD,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,CAAC,QAAQ,CAAC;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAAoB,EACpB,UAAmB;IAEnB,2DAA2D;IAC3D,MAAM,GAAG,GACP,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QACrD,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO;QACrC,CAAC,CAAC,iBAAiB,CAAC;IAExB,OAAO;QACL,WAAW,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,SAAS;QACpD,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,CAAC,GAAG,CAAC;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,WAAoB;IAEpB,MAAM,IAAI,GACR,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;QACvD,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,OAAO;QACtC,CAAC,CAAC,iBAAiB,CAAC;IAExB,OAAO;QACL,WAAW,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,SAAS;QACpD,YAAY,EAAE,iBAAiB;QAC/B,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,CAAC,IAAI,CAAC;KACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,QAAgB,EAChB,aAAqB,EACrB,GAAW;IAEX,MAAM,KAAK,GAAG,SAAS,CACrB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EACpE,EAAE,EACF,KAAK,CACN,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,SAAS;QACpD,YAAY,EAAE,sBAAsB;QACpC,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,CAAC,GAAG,QAAQ,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC;KAClE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAAoB,EACpB,QAAgB;IAEhB,OAAO;QACL,WAAW,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,SAAS;QACpD,YAAY,EAAE,sBAAsB;QACpC,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,CAAC,GAAG,QAAQ,KAAK,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAExC,YAAoB,EAAE,MAAe;IACrC,MAAM,GAAG,GAAsB,EAAE,CAAC;IAElC,wBAAwB;IACxB,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,YAAY,EACZ,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,OAAO,CACjD,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,iBAAiB,CACjC,YAAY,EACZ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAC7B,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAC5C,EAAE,cAAc,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,EACzC,MAAM,EACN,aAAa,CACd,CAAC;IAEF,wBAAwB;IACxB,KAAK,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,uBAAuB,CACtC,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,GAAG,CACJ,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAED,kFAAkF;IAClF,yEAAyE;IAEzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,qBAAqE,EACrE,oBAAoE;IAEpE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CAAC;IACnE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,oBAAoB,CAAC;IACvD,MAAM,SAAS,GAA+B,EAAE,CAAC;IAEjD,wBAAwB;IACxB,MAAM,UAAU,GAAG,aAAa,CAAC,wBAAwB,EAAE,QAAQ,CAAC,OAAO,CAAC;IAC5E,MAAM,MAAM,GAAG,cAAc,CAAC,wBAAwB,EAAE,QAAQ,CAAC,OAAO,CAAC;IAEzE,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5D,SAAS,CAAC,IAAI,CAAC;YACb,UAAU,EAAE,oBAAoB;YAChC,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;IACzD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;IAEtD,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,SAAS,CAAC,IAAI,CAAC;YACb,UAAU,EAAE,qBAAqB;YACjC,GAAG,SAAS;SACb,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAC5C,aAAa,EACb,cAAc,EACd,aAAa,CACd,CAAC;IAEF,2BAA2B;IAC3B,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,yBAAyB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzE,SAAS,CAAC,IAAI,CAAC;YACb,UAAU,EAAE,iCAAiC,QAAQ,EAAE;YACvD,GAAG,UAAU;SACd,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,uBAAuB,CACtC,QAAQ,CAAC,OAAO,EAChB,QAAQ,EACR,aAAa,EACb,GAAG,CACJ,CAAC;QACF,SAAS,CAAC,IAAI,CAAC;YACb,UAAU,EAAE,wCAAwC,QAAQ,EAAE;YAC9D,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;IAED,oFAAoF;IACpF,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,kBAAkB,CACnC,QAAQ,CAAC,OAAO,EAChB,cAAc,CAAC,KAAK,CACrB,CAAC;QACF,SAAS,CAAC,IAAI,CAAC;YACb,UAAU,EAAE,yBAAyB;YACrC,GAAG,UAAU;SACd,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=warp-tx.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-tx.test.d.ts","sourceRoot":"","sources":["../../src/warp/warp-tx.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { expect } from 'chai';
2
+ import { getCreateSyntheticTokenTx, scaleToRemoteDecimals } from './warp-tx.js';
3
+ describe('Aleo synthetic deployment decimals', () => {
4
+ for (const { decimals, scale, remote } of [
5
+ { decimals: 9, scale: undefined, remote: 9 },
6
+ { decimals: 6, scale: 1, remote: 6 },
7
+ { decimals: 9, scale: 1e9, remote: 18 },
8
+ { decimals: 18, scale: 1e-12, remote: 6 },
9
+ { decimals: 9, scale: 1e-4, remote: 5 },
10
+ { decimals: 0, scale: 1e18, remote: 18 },
11
+ { decimals: 18, scale: 1e-18, remote: 0 },
12
+ ]) {
13
+ it(`initializes local=${decimals}, remote=${remote} for scale=${scale}`, () => {
14
+ const tx = getCreateSyntheticTokenTx('hyp_warp_token_test_v2.aleo', 'Test', 'TEST', decimals, scaleToRemoteDecimals(decimals, scale));
15
+ expect(tx.inputs.slice(-2)).to.deep.equal([
16
+ `${decimals}u8`,
17
+ `${remote}u8`,
18
+ ]);
19
+ });
20
+ }
21
+ it('preserves unscaled initialization for existing callers', () => {
22
+ const tx = getCreateSyntheticTokenTx('hyp_warp_token_test.aleo', 'Test', 'TEST', 6);
23
+ expect(tx.inputs.slice(-2)).to.deep.equal(['6u8', '6u8']);
24
+ });
25
+ for (const scale of [0, -10, 3, 0.3, 0.11, NaN, Infinity]) {
26
+ it(`rejects invalid scale ${scale}`, () => {
27
+ expect(() => scaleToRemoteDecimals(9, scale)).to.throw('power of 10');
28
+ });
29
+ }
30
+ for (const { decimals, scale } of [
31
+ { decimals: 9, scale: 1e19 },
32
+ { decimals: 20, scale: 1e-19 },
33
+ { decimals: 2, scale: 1e-3 },
34
+ { decimals: 255, scale: 10 },
35
+ { decimals: -1, scale: 1 },
36
+ { decimals: 256, scale: 1 },
37
+ { decimals: 1.5, scale: 1 },
38
+ ]) {
39
+ it(`rejects unsupported decimals=${decimals}, scale=${scale}`, () => {
40
+ expect(() => scaleToRemoteDecimals(decimals, scale)).to.throw();
41
+ });
42
+ }
43
+ });
44
+ //# sourceMappingURL=warp-tx.test.js.map