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