@humanode-hyperlane/radix-sdk 0.0.0-stage → 30.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/LICENSE.md +193 -0
  2. package/README.md +42 -2
  3. package/dist/clients/protocol.d.ts +29 -0
  4. package/dist/clients/protocol.d.ts.map +1 -0
  5. package/dist/clients/protocol.js +95 -0
  6. package/dist/clients/protocol.js.map +1 -0
  7. package/dist/clients/provider.d.ts +100 -0
  8. package/dist/clients/provider.d.ts.map +1 -0
  9. package/dist/clients/provider.js +481 -0
  10. package/dist/clients/provider.js.map +1 -0
  11. package/dist/clients/signer.d.ts +66 -0
  12. package/dist/clients/signer.d.ts.map +1 -0
  13. package/dist/clients/signer.js +368 -0
  14. package/dist/clients/signer.js.map +1 -0
  15. package/dist/hook/hook-artifact-manager.d.ts +17 -0
  16. package/dist/hook/hook-artifact-manager.d.ts.map +1 -0
  17. package/dist/hook/hook-artifact-manager.js +60 -0
  18. package/dist/hook/hook-artifact-manager.js.map +1 -0
  19. package/dist/hook/hook-query.d.ts +22 -0
  20. package/dist/hook/hook-query.d.ts.map +1 -0
  21. package/dist/hook/hook-query.js +79 -0
  22. package/dist/hook/hook-query.js.map +1 -0
  23. package/dist/hook/hook-tx.d.ts +21 -0
  24. package/dist/hook/hook-tx.d.ts.map +1 -0
  25. package/dist/hook/hook-tx.js +26 -0
  26. package/dist/hook/hook-tx.js.map +1 -0
  27. package/dist/hook/igp-hook.d.ts +24 -0
  28. package/dist/hook/igp-hook.d.ts.map +1 -0
  29. package/dist/hook/igp-hook.js +148 -0
  30. package/dist/hook/igp-hook.js.map +1 -0
  31. package/dist/hook/merkle-tree-hook.d.ts +24 -0
  32. package/dist/hook/merkle-tree-hook.d.ts.map +1 -0
  33. package/dist/hook/merkle-tree-hook.js +51 -0
  34. package/dist/hook/merkle-tree-hook.js.map +1 -0
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +12 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/ism/ism-artifact-manager.d.ts +14 -0
  40. package/dist/ism/ism-artifact-manager.d.ts.map +1 -0
  41. package/dist/ism/ism-artifact-manager.js +67 -0
  42. package/dist/ism/ism-artifact-manager.js.map +1 -0
  43. package/dist/ism/ism-query.d.ts +23 -0
  44. package/dist/ism/ism-query.d.ts.map +1 -0
  45. package/dist/ism/ism-query.js +84 -0
  46. package/dist/ism/ism-query.js.map +1 -0
  47. package/dist/ism/ism-tx.d.ts +31 -0
  48. package/dist/ism/ism-tx.d.ts.map +1 -0
  49. package/dist/ism/ism-tx.js +43 -0
  50. package/dist/ism/ism-tx.js.map +1 -0
  51. package/dist/ism/multisig-ism.d.ts +38 -0
  52. package/dist/ism/multisig-ism.d.ts.map +1 -0
  53. package/dist/ism/multisig-ism.js +107 -0
  54. package/dist/ism/multisig-ism.js.map +1 -0
  55. package/dist/ism/routing-ism.d.ts +23 -0
  56. package/dist/ism/routing-ism.d.ts.map +1 -0
  57. package/dist/ism/routing-ism.js +129 -0
  58. package/dist/ism/routing-ism.js.map +1 -0
  59. package/dist/ism/test-ism.d.ts +23 -0
  60. package/dist/ism/test-ism.d.ts.map +1 -0
  61. package/dist/ism/test-ism.js +49 -0
  62. package/dist/ism/test-ism.js.map +1 -0
  63. package/dist/mailbox/mailbox-artifact-manager.d.ts +15 -0
  64. package/dist/mailbox/mailbox-artifact-manager.d.ts.map +1 -0
  65. package/dist/mailbox/mailbox-artifact-manager.js +29 -0
  66. package/dist/mailbox/mailbox-artifact-manager.js.map +1 -0
  67. package/dist/mailbox/mailbox-query.d.ts +12 -0
  68. package/dist/mailbox/mailbox-query.d.ts.map +1 -0
  69. package/dist/mailbox/mailbox-query.js +72 -0
  70. package/dist/mailbox/mailbox-query.js.map +1 -0
  71. package/dist/mailbox/mailbox-query.test.d.ts +2 -0
  72. package/dist/mailbox/mailbox-query.test.d.ts.map +1 -0
  73. package/dist/mailbox/mailbox-query.test.js +65 -0
  74. package/dist/mailbox/mailbox-query.test.js.map +1 -0
  75. package/dist/mailbox/mailbox-tx.d.ts +21 -0
  76. package/dist/mailbox/mailbox-tx.d.ts.map +1 -0
  77. package/dist/mailbox/mailbox-tx.js +27 -0
  78. package/dist/mailbox/mailbox-tx.js.map +1 -0
  79. package/dist/mailbox/mailbox.d.ts +24 -0
  80. package/dist/mailbox/mailbox.d.ts.map +1 -0
  81. package/dist/mailbox/mailbox.js +171 -0
  82. package/dist/mailbox/mailbox.js.map +1 -0
  83. package/dist/testing/constants.d.ts +61 -0
  84. package/dist/testing/constants.d.ts.map +1 -0
  85. package/dist/testing/constants.js +65 -0
  86. package/dist/testing/constants.js.map +1 -0
  87. package/dist/testing/index.d.ts +8 -0
  88. package/dist/testing/index.d.ts.map +1 -0
  89. package/dist/testing/index.js +11 -0
  90. package/dist/testing/index.js.map +1 -0
  91. package/dist/testing/node.d.ts +13 -0
  92. package/dist/testing/node.d.ts.map +1 -0
  93. package/dist/testing/node.js +42 -0
  94. package/dist/testing/node.js.map +1 -0
  95. package/dist/testing/setup.d.ts +20 -0
  96. package/dist/testing/setup.d.ts.map +1 -0
  97. package/dist/testing/setup.js +61 -0
  98. package/dist/testing/setup.js.map +1 -0
  99. package/dist/tests/e2e-test.setup.d.ts +3 -0
  100. package/dist/tests/e2e-test.setup.d.ts.map +1 -0
  101. package/dist/tests/e2e-test.setup.js +32 -0
  102. package/dist/tests/e2e-test.setup.js.map +1 -0
  103. package/dist/tests/hook.e2e-test.d.ts +2 -0
  104. package/dist/tests/hook.e2e-test.d.ts.map +1 -0
  105. package/dist/tests/hook.e2e-test.js +369 -0
  106. package/dist/tests/hook.e2e-test.js.map +1 -0
  107. package/dist/tests/ism.e2e-test.d.ts +2 -0
  108. package/dist/tests/ism.e2e-test.d.ts.map +1 -0
  109. package/dist/tests/ism.e2e-test.js +250 -0
  110. package/dist/tests/ism.e2e-test.js.map +1 -0
  111. package/dist/tests/mailbox.e2e-test.d.ts +2 -0
  112. package/dist/tests/mailbox.e2e-test.d.ts.map +1 -0
  113. package/dist/tests/mailbox.e2e-test.js +254 -0
  114. package/dist/tests/mailbox.e2e-test.js.map +1 -0
  115. package/dist/tests/validator-announce.e2e-test.d.ts +2 -0
  116. package/dist/tests/validator-announce.e2e-test.d.ts.map +1 -0
  117. package/dist/tests/validator-announce.e2e-test.js +116 -0
  118. package/dist/tests/validator-announce.e2e-test.js.map +1 -0
  119. package/dist/tests/warp.e2e-test.d.ts +2 -0
  120. package/dist/tests/warp.e2e-test.d.ts.map +1 -0
  121. package/dist/tests/warp.e2e-test.js +602 -0
  122. package/dist/tests/warp.e2e-test.js.map +1 -0
  123. package/dist/utils/base-query.d.ts +188 -0
  124. package/dist/utils/base-query.d.ts.map +1 -0
  125. package/dist/utils/base-query.js +207 -0
  126. package/dist/utils/base-query.js.map +1 -0
  127. package/dist/utils/base.d.ts +67 -0
  128. package/dist/utils/base.d.ts.map +1 -0
  129. package/dist/utils/base.js +353 -0
  130. package/dist/utils/base.js.map +1 -0
  131. package/dist/utils/constants.d.ts +20 -0
  132. package/dist/utils/constants.d.ts.map +1 -0
  133. package/dist/utils/constants.js +20 -0
  134. package/dist/utils/constants.js.map +1 -0
  135. package/dist/utils/signer.d.ts +17 -0
  136. package/dist/utils/signer.d.ts.map +1 -0
  137. package/dist/utils/signer.js +60 -0
  138. package/dist/utils/signer.js.map +1 -0
  139. package/dist/utils/types.d.ts +139 -0
  140. package/dist/utils/types.d.ts.map +1 -0
  141. package/dist/utils/types.js +39 -0
  142. package/dist/utils/types.js.map +1 -0
  143. package/dist/utils/utils.d.ts +8 -0
  144. package/dist/utils/utils.d.ts.map +1 -0
  145. package/dist/utils/utils.js +47 -0
  146. package/dist/utils/utils.js.map +1 -0
  147. package/dist/utils/utils.test.d.ts +2 -0
  148. package/dist/utils/utils.test.d.ts.map +1 -0
  149. package/dist/utils/utils.test.js +27 -0
  150. package/dist/utils/utils.test.js.map +1 -0
  151. package/dist/validator-announce/validator-announce-artifact-manager.d.ts +14 -0
  152. package/dist/validator-announce/validator-announce-artifact-manager.d.ts.map +1 -0
  153. package/dist/validator-announce/validator-announce-artifact-manager.js +21 -0
  154. package/dist/validator-announce/validator-announce-artifact-manager.js.map +1 -0
  155. package/dist/validator-announce/validator-announce-query.d.ts +6 -0
  156. package/dist/validator-announce/validator-announce-query.d.ts.map +1 -0
  157. package/dist/validator-announce/validator-announce-query.js +10 -0
  158. package/dist/validator-announce/validator-announce-query.js.map +1 -0
  159. package/dist/validator-announce/validator-announce-tx.d.ts +4 -0
  160. package/dist/validator-announce/validator-announce-tx.d.ts.map +1 -0
  161. package/dist/validator-announce/validator-announce-tx.js +6 -0
  162. package/dist/validator-announce/validator-announce-tx.js.map +1 -0
  163. package/dist/validator-announce/validator-announce.d.ts +23 -0
  164. package/dist/validator-announce/validator-announce.d.ts.map +1 -0
  165. package/dist/validator-announce/validator-announce.js +52 -0
  166. package/dist/validator-announce/validator-announce.js.map +1 -0
  167. package/dist/warp/collateral-token.d.ts +23 -0
  168. package/dist/warp/collateral-token.d.ts.map +1 -0
  169. package/dist/warp/collateral-token.js +130 -0
  170. package/dist/warp/collateral-token.js.map +1 -0
  171. package/dist/warp/populate.d.ts +71 -0
  172. package/dist/warp/populate.d.ts.map +1 -0
  173. package/dist/warp/populate.js +110 -0
  174. package/dist/warp/populate.js.map +1 -0
  175. package/dist/warp/query.d.ts +44 -0
  176. package/dist/warp/query.d.ts.map +1 -0
  177. package/dist/warp/query.js +154 -0
  178. package/dist/warp/query.js.map +1 -0
  179. package/dist/warp/synthetic-token.d.ts +23 -0
  180. package/dist/warp/synthetic-token.d.ts.map +1 -0
  181. package/dist/warp/synthetic-token.js +131 -0
  182. package/dist/warp/synthetic-token.js.map +1 -0
  183. package/dist/warp/tx.d.ts +54 -0
  184. package/dist/warp/tx.d.ts.map +1 -0
  185. package/dist/warp/tx.js +85 -0
  186. package/dist/warp/tx.js.map +1 -0
  187. package/dist/warp/warp-artifact-manager.d.ts +15 -0
  188. package/dist/warp/warp-artifact-manager.d.ts.map +1 -0
  189. package/dist/warp/warp-artifact-manager.js +49 -0
  190. package/dist/warp/warp-artifact-manager.js.map +1 -0
  191. package/dist/warp/warp-query.d.ts +9 -0
  192. package/dist/warp/warp-query.d.ts.map +1 -0
  193. package/dist/warp/warp-query.js +130 -0
  194. package/dist/warp/warp-query.js.map +1 -0
  195. package/dist/warp/warp-tx.d.ts +48 -0
  196. package/dist/warp/warp-tx.d.ts.map +1 -0
  197. package/dist/warp/warp-tx.js +125 -0
  198. package/dist/warp/warp-tx.js.map +1 -0
  199. package/docker-compose.yml +139 -0
  200. package/package.json +64 -3
@@ -0,0 +1,602 @@
1
+ import chai, { expect } from 'chai';
2
+ import chaiAsPromised from 'chai-as-promised';
3
+ import { AltVM } from '@humanode-hyperlane/provider-sdk';
4
+ import { ArtifactState, } from '@humanode-hyperlane/provider-sdk/artifact';
5
+ import { assert, eqAddressRadix } from '@humanode-hyperlane/utils';
6
+ import { RadixSigner } from '../clients/signer.js';
7
+ import { DEFAULT_E2E_TEST_TIMEOUT, OTHER_RADIX_PRIVATE_KEY, TEST_RADIX_BURN_ADDRESS, TEST_RADIX_CHAIN_METADATA, TEST_RADIX_DEPLOYER_ADDRESS, TEST_RADIX_PRIVATE_KEY, } from '../testing/constants.js';
8
+ import { transactionManifestToString } from '../utils/utils.js';
9
+ import { RadixWarpArtifactManager } from '../warp/warp-artifact-manager.js';
10
+ import { DEPLOYED_TEST_CHAIN_METADATA } from './e2e-test.setup.js';
11
+ chai.use(chaiAsPromised);
12
+ describe('Radix Warp Tokens (e2e)', function () {
13
+ this.timeout(DEFAULT_E2E_TEST_TIMEOUT);
14
+ let radixSigner;
15
+ let otherRadixSigner;
16
+ let providerSdkSigner;
17
+ let otherProviderSdkSigner;
18
+ let artifactManager;
19
+ const DOMAIN_1 = 42;
20
+ const DOMAIN_2 = 96;
21
+ const ZERO_ADDRESS = '0000000000000000000000000000000000000000';
22
+ before(async () => {
23
+ const rpcUrls = TEST_RADIX_CHAIN_METADATA.rpcUrls?.map((url) => url.http) ?? [];
24
+ assert(rpcUrls.length > 0, 'Expected at least 1 rpc url for the tests');
25
+ radixSigner = (await RadixSigner.connectWithSigner(rpcUrls, TEST_RADIX_PRIVATE_KEY, {
26
+ metadata: {
27
+ chainId: DEPLOYED_TEST_CHAIN_METADATA.chainId,
28
+ gatewayUrls: DEPLOYED_TEST_CHAIN_METADATA.gatewayUrls,
29
+ packageAddress: DEPLOYED_TEST_CHAIN_METADATA.packageAddress,
30
+ },
31
+ }));
32
+ otherRadixSigner = (await RadixSigner.connectWithSigner(rpcUrls, OTHER_RADIX_PRIVATE_KEY, {
33
+ metadata: {
34
+ chainId: DEPLOYED_TEST_CHAIN_METADATA.chainId,
35
+ gatewayUrls: DEPLOYED_TEST_CHAIN_METADATA.gatewayUrls,
36
+ packageAddress: DEPLOYED_TEST_CHAIN_METADATA.packageAddress,
37
+ },
38
+ }));
39
+ await otherRadixSigner['signer'].getTestnetXrd();
40
+ providerSdkSigner = radixSigner;
41
+ otherProviderSdkSigner = otherRadixSigner;
42
+ const gateway = radixSigner.gateway;
43
+ const base = radixSigner.base;
44
+ artifactManager = new RadixWarpArtifactManager(gateway, base);
45
+ });
46
+ // Table-driven tests for both token types
47
+ const tokenTestCases = [
48
+ {
49
+ type: AltVM.TokenType.collateral,
50
+ name: 'collateral',
51
+ getConfig: () => ({
52
+ type: AltVM.TokenType.collateral,
53
+ owner: TEST_RADIX_DEPLOYER_ADDRESS,
54
+ mailbox: TEST_RADIX_DEPLOYER_ADDRESS,
55
+ token: TEST_RADIX_CHAIN_METADATA.nativeToken.denom,
56
+ remoteRouters: {},
57
+ destinationGas: {},
58
+ }),
59
+ expectedFields: {
60
+ token: TEST_RADIX_CHAIN_METADATA.nativeToken.denom,
61
+ },
62
+ },
63
+ {
64
+ type: AltVM.TokenType.synthetic,
65
+ name: 'synthetic',
66
+ getConfig: () => ({
67
+ type: AltVM.TokenType.synthetic,
68
+ owner: TEST_RADIX_DEPLOYER_ADDRESS,
69
+ mailbox: TEST_RADIX_DEPLOYER_ADDRESS,
70
+ name: 'Test Token',
71
+ symbol: 'TEST',
72
+ decimals: 18,
73
+ remoteRouters: {},
74
+ destinationGas: {},
75
+ }),
76
+ expectedFields: { name: 'Test Token', symbol: 'TEST', decimals: 18 },
77
+ },
78
+ ];
79
+ tokenTestCases.forEach(({ type, name, getConfig, expectedFields }) => {
80
+ describe(`${name} token`, () => {
81
+ it('should create and read token', async () => {
82
+ const config = getConfig();
83
+ const writer = artifactManager.createWriter(type, radixSigner);
84
+ const [result, receipts] = await writer.create({ config });
85
+ expect(result.artifactState).to.equal(ArtifactState.DEPLOYED);
86
+ expect(result.config.type).to.equal(type);
87
+ expect(result.deployed.address).to.be.a('string').and.not.be.empty;
88
+ expect(receipts).to.be.an('array').with.length.greaterThan(0);
89
+ // Verify expected fields
90
+ if (expectedFields) {
91
+ for (const [field, expectedValue] of Object.entries(expectedFields)) {
92
+ expect(result.config[field]).to.equal(expectedValue);
93
+ }
94
+ }
95
+ // Read back the token
96
+ const reader = artifactManager.createReader(type);
97
+ const readToken = await reader.read(result.deployed.address);
98
+ expect(readToken.artifactState).to.equal(ArtifactState.DEPLOYED);
99
+ expect(readToken.config.type).to.equal(type);
100
+ expect(readToken.deployed.address).to.equal(result.deployed.address);
101
+ });
102
+ it('should enroll remote routers', async () => {
103
+ const initialConfig = getConfig();
104
+ const writer = artifactManager.createWriter(type, radixSigner);
105
+ const [deployedToken] = await writer.create({
106
+ config: initialConfig,
107
+ });
108
+ // Update with remote routers
109
+ const updatedConfig = {
110
+ ...deployedToken,
111
+ config: {
112
+ ...deployedToken.config,
113
+ remoteRouters: {
114
+ [DOMAIN_1]: {
115
+ address: '0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4',
116
+ },
117
+ [DOMAIN_2]: {
118
+ address: '0x1aac830e4d71000c25149af643b5a18c7a907e2d36147d8b57c5847b03ea5528',
119
+ },
120
+ },
121
+ destinationGas: {
122
+ [DOMAIN_1]: '100000',
123
+ [DOMAIN_2]: '200000',
124
+ },
125
+ },
126
+ };
127
+ const txs = await writer.update(updatedConfig);
128
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
129
+ for (const tx of txs) {
130
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
131
+ }
132
+ // Verify
133
+ const reader = artifactManager.createReader(type);
134
+ const readToken = await reader.read(deployedToken.deployed.address);
135
+ expect(readToken.config.remoteRouters[DOMAIN_1].address).to.equal('0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4');
136
+ expect(readToken.config.remoteRouters[DOMAIN_2].address).to.equal('0x1aac830e4d71000c25149af643b5a18c7a907e2d36147d8b57c5847b03ea5528');
137
+ expect(readToken.config.destinationGas[DOMAIN_1]).to.equal('100000');
138
+ expect(readToken.config.destinationGas[DOMAIN_2]).to.equal('200000');
139
+ });
140
+ it('should unenroll removed routers', async () => {
141
+ const initialConfig = getConfig();
142
+ initialConfig.remoteRouters = {
143
+ [DOMAIN_1]: {
144
+ address: '0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4',
145
+ },
146
+ [DOMAIN_2]: {
147
+ address: '0x1aac830e4d71000c25149af643b5a18c7a907e2d36147d8b57c5847b03ea5528',
148
+ },
149
+ };
150
+ initialConfig.destinationGas = {
151
+ [DOMAIN_1]: '100000',
152
+ [DOMAIN_2]: '200000',
153
+ };
154
+ const writer = artifactManager.createWriter(type, radixSigner);
155
+ const [deployedToken] = await writer.create({
156
+ config: initialConfig,
157
+ });
158
+ // Remove DOMAIN_2
159
+ const updatedConfig = {
160
+ ...deployedToken,
161
+ config: {
162
+ ...deployedToken.config,
163
+ remoteRouters: {
164
+ [DOMAIN_1]: {
165
+ address: '0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4',
166
+ },
167
+ },
168
+ destinationGas: {
169
+ [DOMAIN_1]: '100000',
170
+ },
171
+ },
172
+ };
173
+ const txs = await writer.update(updatedConfig);
174
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
175
+ for (const tx of txs) {
176
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
177
+ }
178
+ // Verify DOMAIN_2 was unenrolled
179
+ const reader = artifactManager.createReader(type);
180
+ const readToken = await reader.read(deployedToken.deployed.address);
181
+ expect(readToken.config.remoteRouters[DOMAIN_1]).to.exist;
182
+ expect(readToken.config.remoteRouters[DOMAIN_2]).to.be.undefined;
183
+ });
184
+ it('should update when only destination gas changes', async () => {
185
+ const initialConfig = getConfig();
186
+ const routerAddress = '0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4';
187
+ // Create with initial gas value
188
+ initialConfig.remoteRouters = {
189
+ [DOMAIN_1]: { address: routerAddress },
190
+ };
191
+ initialConfig.destinationGas = {
192
+ [DOMAIN_1]: '100000',
193
+ };
194
+ const writer = artifactManager.createWriter(type, radixSigner);
195
+ const [deployedToken] = await writer.create({
196
+ config: initialConfig,
197
+ });
198
+ // Verify initial gas value
199
+ const reader = artifactManager.createReader(type);
200
+ const readToken1 = await reader.read(deployedToken.deployed.address);
201
+ expect(readToken1.config.destinationGas[DOMAIN_1]).to.equal('100000');
202
+ // Update only gas (router address unchanged)
203
+ const updatedConfig = {
204
+ ...deployedToken,
205
+ config: {
206
+ ...deployedToken.config,
207
+ remoteRouters: {
208
+ [DOMAIN_1]: { address: routerAddress }, // Same address
209
+ },
210
+ destinationGas: {
211
+ [DOMAIN_1]: '200000', // Changed gas
212
+ },
213
+ },
214
+ };
215
+ const txs = await writer.update(updatedConfig);
216
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
217
+ // Execute update
218
+ for (const tx of txs) {
219
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
220
+ }
221
+ // Verify gas changed
222
+ const readToken2 = await reader.read(deployedToken.deployed.address);
223
+ expect(readToken2.config.destinationGas[DOMAIN_1]).to.equal('200000');
224
+ expect(eqAddressRadix(readToken2.config.remoteRouters[DOMAIN_1].address, routerAddress)).to.be.true;
225
+ });
226
+ it('should transfer ownership via update (ownership last)', async () => {
227
+ const initialConfig = getConfig();
228
+ const writer = artifactManager.createWriter(type, radixSigner);
229
+ const [deployedToken] = await writer.create({
230
+ config: initialConfig,
231
+ });
232
+ const customIsmAddress = TEST_RADIX_BURN_ADDRESS;
233
+ // Update routers, ISM, AND ownership
234
+ const updatedConfig = {
235
+ ...deployedToken,
236
+ config: {
237
+ ...deployedToken.config,
238
+ owner: TEST_RADIX_BURN_ADDRESS,
239
+ interchainSecurityModule: {
240
+ artifactState: ArtifactState.UNDERIVED,
241
+ deployed: {
242
+ address: customIsmAddress,
243
+ },
244
+ },
245
+ remoteRouters: {
246
+ [DOMAIN_1]: {
247
+ address: '0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4',
248
+ },
249
+ },
250
+ destinationGas: {
251
+ [DOMAIN_1]: '100000',
252
+ },
253
+ },
254
+ };
255
+ const txs = await writer.update(updatedConfig);
256
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
257
+ // Verify ownership transfer is the LAST transaction
258
+ const lastTx = txs[txs.length - 1];
259
+ expect(lastTx.annotation).to.include('owner');
260
+ // Execute all transactions
261
+ for (const tx of txs) {
262
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
263
+ }
264
+ // Verify router enrollment, ISM, AND ownership transfer succeeded
265
+ const reader = artifactManager.createReader(type);
266
+ const readToken = await reader.read(deployedToken.deployed.address);
267
+ expect(readToken.config.remoteRouters[DOMAIN_1].address).to.equal('0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4');
268
+ const currentIsmAddress = readToken.config.interchainSecurityModule?.deployed.address;
269
+ assert(currentIsmAddress, 'Expected current ism address to be set');
270
+ expect(eqAddressRadix(currentIsmAddress, customIsmAddress)).to.be.true;
271
+ expect(eqAddressRadix(readToken.config.owner, TEST_RADIX_BURN_ADDRESS))
272
+ .to.be.true;
273
+ });
274
+ it('should return no update transactions when config is unchanged', async () => {
275
+ const config = getConfig();
276
+ const writer = artifactManager.createWriter(type, radixSigner);
277
+ const [deployedToken] = await writer.create({ config });
278
+ const txs = await writer.update(deployedToken);
279
+ expect(txs).to.be.an('array').with.length(0);
280
+ });
281
+ describe('Ism updates', function () {
282
+ it('should unset ISM when changed from address to undefined', async () => {
283
+ const initialConfig = getConfig();
284
+ const customIsmAddress = TEST_RADIX_BURN_ADDRESS;
285
+ // Create with ISM set
286
+ initialConfig.interchainSecurityModule = {
287
+ artifactState: ArtifactState.UNDERIVED,
288
+ deployed: {
289
+ address: customIsmAddress,
290
+ },
291
+ };
292
+ const writer = artifactManager.createWriter(type, radixSigner);
293
+ const [deployedToken] = await writer.create({
294
+ config: initialConfig,
295
+ });
296
+ // Verify ISM is set
297
+ const reader = artifactManager.createReader(type);
298
+ const readToken1 = await reader.read(deployedToken.deployed.address);
299
+ const currentIsmAddress = readToken1.config.interchainSecurityModule?.deployed.address;
300
+ assert(currentIsmAddress, 'Expected current ism address to be set');
301
+ expect(eqAddressRadix(currentIsmAddress, customIsmAddress)).to.be
302
+ .true;
303
+ // Update to clear ISM (set to undefined)
304
+ const updatedConfig = {
305
+ ...deployedToken,
306
+ config: {
307
+ ...deployedToken.config,
308
+ interchainSecurityModule: undefined,
309
+ },
310
+ };
311
+ const txs = await writer.update(updatedConfig);
312
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
313
+ // Execute update
314
+ for (const tx of txs) {
315
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
316
+ }
317
+ // Verify ISM is now unset
318
+ const readToken2 = await reader.read(deployedToken.deployed.address);
319
+ expect(readToken2.config.interchainSecurityModule).to.be.undefined;
320
+ });
321
+ it('should set ISM when changed from undefined to address', async () => {
322
+ const initialConfig = getConfig();
323
+ // Start with no ISM
324
+ initialConfig.interchainSecurityModule = undefined;
325
+ const writer = artifactManager.createWriter(type, radixSigner);
326
+ const [deployedToken] = await writer.create({
327
+ config: initialConfig,
328
+ });
329
+ // Verify ISM is unset
330
+ const reader = artifactManager.createReader(type);
331
+ const readToken1 = await reader.read(deployedToken.deployed.address);
332
+ expect(readToken1.config.interchainSecurityModule).to.be.undefined;
333
+ // Update to set ISM
334
+ const customIsmAddress = TEST_RADIX_BURN_ADDRESS;
335
+ const updatedConfig = {
336
+ ...deployedToken,
337
+ config: {
338
+ ...deployedToken.config,
339
+ interchainSecurityModule: {
340
+ artifactState: ArtifactState.UNDERIVED,
341
+ deployed: {
342
+ address: customIsmAddress,
343
+ },
344
+ },
345
+ },
346
+ };
347
+ const txs = await writer.update(updatedConfig);
348
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
349
+ // Execute update
350
+ for (const tx of txs) {
351
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
352
+ }
353
+ // Verify ISM is now set
354
+ const readToken2 = await reader.read(deployedToken.deployed.address);
355
+ const currentIsmAddress = readToken2.config.interchainSecurityModule?.deployed.address;
356
+ assert(currentIsmAddress, 'Expected current ism address to be set');
357
+ expect(eqAddressRadix(currentIsmAddress, customIsmAddress)).to.be
358
+ .true;
359
+ });
360
+ it('should change ISM when updated to different address', async () => {
361
+ const initialConfig = getConfig();
362
+ const firstIsmAddress = TEST_RADIX_BURN_ADDRESS;
363
+ // Create with first ISM
364
+ initialConfig.interchainSecurityModule = {
365
+ artifactState: ArtifactState.UNDERIVED,
366
+ deployed: {
367
+ address: firstIsmAddress,
368
+ },
369
+ };
370
+ const writer = artifactManager.createWriter(type, radixSigner);
371
+ const [deployedToken] = await writer.create({
372
+ config: initialConfig,
373
+ });
374
+ // Verify first ISM is set
375
+ const reader = artifactManager.createReader(type);
376
+ const readToken1 = await reader.read(deployedToken.deployed.address);
377
+ const currentIsmAddress = readToken1.config.interchainSecurityModule?.deployed.address;
378
+ assert(currentIsmAddress, 'Expected current ism address to be set');
379
+ expect(eqAddressRadix(currentIsmAddress, firstIsmAddress)).to.be.true;
380
+ // Update to second ISM
381
+ const secondIsmAddress = TEST_RADIX_DEPLOYER_ADDRESS;
382
+ const updatedConfig = {
383
+ ...deployedToken,
384
+ config: {
385
+ ...deployedToken.config,
386
+ interchainSecurityModule: {
387
+ artifactState: ArtifactState.UNDERIVED,
388
+ deployed: {
389
+ address: secondIsmAddress,
390
+ },
391
+ },
392
+ },
393
+ };
394
+ const txs = await writer.update(updatedConfig);
395
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
396
+ // Execute update
397
+ for (const tx of txs) {
398
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
399
+ }
400
+ // Verify ISM changed to second address
401
+ const readToken2 = await reader.read(deployedToken.deployed.address);
402
+ const currentIsmAddress2 = readToken2.config.interchainSecurityModule?.deployed.address;
403
+ assert(currentIsmAddress2, 'Expected current ism address to be set');
404
+ expect(eqAddressRadix(currentIsmAddress2, secondIsmAddress)).to.be
405
+ .true;
406
+ });
407
+ it('should not generate ISM update tx when ISM unchanged', async () => {
408
+ const initialConfig = getConfig();
409
+ const customIsmAddress = TEST_RADIX_BURN_ADDRESS;
410
+ // Create with ISM
411
+ initialConfig.interchainSecurityModule = {
412
+ artifactState: ArtifactState.UNDERIVED,
413
+ deployed: {
414
+ address: customIsmAddress,
415
+ },
416
+ };
417
+ const writer = artifactManager.createWriter(type, radixSigner);
418
+ const [deployedToken] = await writer.create({
419
+ config: initialConfig,
420
+ });
421
+ // Update with same ISM (no change)
422
+ const txs = await writer.update(deployedToken);
423
+ // Should have no transactions (ISM unchanged)
424
+ expect(txs).to.be.an('array').with.length(0);
425
+ });
426
+ it('should not generate ISM update tx when both undefined', async () => {
427
+ const initialConfig = getConfig();
428
+ // Create without ISM
429
+ initialConfig.interchainSecurityModule = undefined;
430
+ const writer = artifactManager.createWriter(type, radixSigner);
431
+ const [deployedToken] = await writer.create({
432
+ config: initialConfig,
433
+ });
434
+ // Update with ISM still undefined (no change)
435
+ const txs = await writer.update(deployedToken);
436
+ // Should have no transactions (ISM still undefined)
437
+ expect(txs).to.be.an('array').with.length(0);
438
+ });
439
+ it('should unset ISM when changed to zero address', async () => {
440
+ const initialConfig = getConfig();
441
+ const customIsmAddress = TEST_RADIX_BURN_ADDRESS;
442
+ // Create with ISM set
443
+ initialConfig.interchainSecurityModule = {
444
+ artifactState: ArtifactState.UNDERIVED,
445
+ deployed: {
446
+ address: customIsmAddress,
447
+ },
448
+ };
449
+ const writer = artifactManager.createWriter(type, radixSigner);
450
+ const [deployedToken] = await writer.create({
451
+ config: initialConfig,
452
+ });
453
+ // Verify ISM is set
454
+ const reader = artifactManager.createReader(type);
455
+ const readToken1 = await reader.read(deployedToken.deployed.address);
456
+ const currentIsmAddress = readToken1.config.interchainSecurityModule?.deployed.address;
457
+ assert(currentIsmAddress, 'Expected current ism address to be set');
458
+ expect(eqAddressRadix(currentIsmAddress, customIsmAddress)).to.be
459
+ .true;
460
+ // Update to zero address (should unset ISM)
461
+ const updatedConfig = {
462
+ ...deployedToken,
463
+ config: {
464
+ ...deployedToken.config,
465
+ interchainSecurityModule: {
466
+ artifactState: ArtifactState.UNDERIVED,
467
+ deployed: {
468
+ address: ZERO_ADDRESS,
469
+ },
470
+ },
471
+ },
472
+ };
473
+ const txs = await writer.update(updatedConfig);
474
+ expect(txs).to.be.an('array').with.length.greaterThan(0);
475
+ // Execute update
476
+ for (const tx of txs) {
477
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
478
+ }
479
+ // Verify ISM is now unset (zero address treated as unset)
480
+ const readToken2 = await reader.read(deployedToken.deployed.address);
481
+ expect(readToken2.config.interchainSecurityModule).to.be.undefined;
482
+ });
483
+ it('should not generate ISM update tx when current ism is undefined and the 0 address is provided in the config', async () => {
484
+ const initialConfig = getConfig();
485
+ const writer = artifactManager.createWriter(type, radixSigner);
486
+ const [deployedToken] = await writer.create({
487
+ config: initialConfig,
488
+ });
489
+ const updatedConfig = {
490
+ ...deployedToken,
491
+ config: {
492
+ ...deployedToken.config,
493
+ interchainSecurityModule: {
494
+ artifactState: ArtifactState.UNDERIVED,
495
+ deployed: {
496
+ address: ZERO_ADDRESS,
497
+ },
498
+ },
499
+ },
500
+ };
501
+ // Try to update with ISM still undefined (should not generate tx)
502
+ const txs = await writer.update(updatedConfig);
503
+ // Should generate 0 transactions (ISM unchanged)
504
+ expect(txs).to.be.an('array').with.length(0);
505
+ });
506
+ });
507
+ it('should encode all update transactions with current owner as sender after ownership transfer', async () => {
508
+ const initialConfig = getConfig();
509
+ // Create with initial state
510
+ initialConfig.remoteRouters = {
511
+ [DOMAIN_1]: {
512
+ address: '0xc2c6885c3c9e16064d86ce46b7a1ac57888a1e60b2ce88d2504347d3418399c4',
513
+ },
514
+ };
515
+ initialConfig.destinationGas = {
516
+ [DOMAIN_1]: '100000',
517
+ };
518
+ const writer = artifactManager.createWriter(type, radixSigner);
519
+ const [deployedToken] = await writer.create({
520
+ config: initialConfig,
521
+ });
522
+ const signerAddress = radixSigner.getSignerAddress();
523
+ // Transfer ownership to a different address first
524
+ const newOwnerAddress = otherRadixSigner.getSignerAddress();
525
+ const ownershipTransferConfig = {
526
+ ...deployedToken,
527
+ config: {
528
+ ...deployedToken.config,
529
+ owner: newOwnerAddress,
530
+ },
531
+ };
532
+ const ownershipTxs = await writer.update(ownershipTransferConfig);
533
+ for (const tx of ownershipTxs) {
534
+ await providerSdkSigner.sendAndConfirmTransaction(tx);
535
+ }
536
+ // Read token to verify ownership transfer
537
+ const tokenAfterOwnershipTransfer = await writer.read(deployedToken.deployed.address);
538
+ expect(eqAddressRadix(tokenAfterOwnershipTransfer.config.owner, newOwnerAddress)).to.be.true;
539
+ // Perform multiple updates
540
+ const newIsmAddress = otherRadixSigner.getSignerAddress();
541
+ const updatedConfig = {
542
+ ...tokenAfterOwnershipTransfer,
543
+ deployed: deployedToken.deployed,
544
+ config: {
545
+ ...tokenAfterOwnershipTransfer.config,
546
+ interchainSecurityModule: {
547
+ artifactState: ArtifactState.UNDERIVED,
548
+ deployed: {
549
+ address: newIsmAddress,
550
+ },
551
+ },
552
+ remoteRouters: {
553
+ // Remove DOMAIN_1, add DOMAIN_2
554
+ [DOMAIN_2]: {
555
+ address: '0x1aac830e4d71000c25149af643b5a18c7a907e2d36147d8b57c5847b03ea5528',
556
+ },
557
+ },
558
+ destinationGas: {
559
+ [DOMAIN_2]: '200000',
560
+ },
561
+ },
562
+ };
563
+ const updateTxs = await writer.update(updatedConfig);
564
+ expect(updateTxs).to.be.an('array').with.length.greaterThan(0);
565
+ // Validate ALL update transactions are encoded for the CURRENT owner (not signer)
566
+ const base = radixSigner.base;
567
+ const networkId = base.getNetworkId();
568
+ for (const tx of updateTxs) {
569
+ const manifestString = await transactionManifestToString(tx.manifest, networkId);
570
+ // Transaction must be encoded for current owner (firstNewOwner), not signer
571
+ expect(manifestString).to.include(newOwnerAddress, `Transaction "${tx.annotation}" must be encoded for current owner ${newOwnerAddress}, not signer ${signerAddress}`);
572
+ expect(manifestString).not.to.include(radixSigner.getSignerAddress(), `Transaction "${tx.annotation}" should not include any reference to the original deployer`);
573
+ // Execute transaction
574
+ await otherProviderSdkSigner.sendAndConfirmTransaction(tx);
575
+ }
576
+ // Verify all updates succeeded
577
+ const finalToken = await writer.read(deployedToken.deployed.address);
578
+ const currentIsmAddress = finalToken.config.interchainSecurityModule?.deployed.address;
579
+ assert(currentIsmAddress, 'Expected current ism address to be set');
580
+ expect(eqAddressRadix(currentIsmAddress, newIsmAddress)).to.be.true;
581
+ expect(finalToken.config.remoteRouters[DOMAIN_1]).to.be.undefined;
582
+ expect(finalToken.config.remoteRouters[DOMAIN_2]).to.exist;
583
+ expect(finalToken.config.destinationGas[DOMAIN_2]).to.equal('200000');
584
+ });
585
+ });
586
+ });
587
+ describe('Generic warp token reading via readWarpToken', () => {
588
+ tokenTestCases.forEach(({ type, name, getConfig }) => {
589
+ it(`should detect and read ${name} token`, async () => {
590
+ const config = getConfig();
591
+ const writer = artifactManager.createWriter(type, radixSigner);
592
+ const [deployedToken] = await writer.create({ config });
593
+ // Read via generic readWarpToken (without knowing the type)
594
+ const readToken = await artifactManager.readWarpToken(deployedToken.deployed.address);
595
+ expect(readToken.artifactState).to.equal(ArtifactState.DEPLOYED);
596
+ expect(readToken.config.type).to.equal(type);
597
+ expect(readToken.deployed.address).to.equal(deployedToken.deployed.address);
598
+ });
599
+ });
600
+ });
601
+ });
602
+ //# sourceMappingURL=warp.e2e-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp.e2e-test.js","sourceRoot":"","sources":["../../src/tests/warp.e2e-test.ts"],"names":[],"mappings":"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"}