@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.
- package/LICENSE.md +193 -0
- package/README.md +42 -2
- package/dist/clients/protocol.d.ts +31 -0
- package/dist/clients/protocol.d.ts.map +1 -0
- package/dist/clients/protocol.js +95 -0
- package/dist/clients/protocol.js.map +1 -0
- package/dist/clients/provider.d.ts +60 -0
- package/dist/clients/provider.d.ts.map +1 -0
- package/dist/clients/provider.js +187 -0
- package/dist/clients/provider.js.map +1 -0
- package/dist/clients/signer.d.ts +24 -0
- package/dist/clients/signer.d.ts.map +1 -0
- package/dist/clients/signer.js +86 -0
- package/dist/clients/signer.js.map +1 -0
- package/dist/hook/hook-artifact-manager.d.ts +17 -0
- package/dist/hook/hook-artifact-manager.d.ts.map +1 -0
- package/dist/hook/hook-artifact-manager.js +60 -0
- package/dist/hook/hook-artifact-manager.js.map +1 -0
- package/dist/hook/hook-query.d.ts +22 -0
- package/dist/hook/hook-query.d.ts.map +1 -0
- package/dist/hook/hook-query.js +79 -0
- package/dist/hook/hook-query.js.map +1 -0
- package/dist/hook/hook-tx.d.ts +21 -0
- package/dist/hook/hook-tx.d.ts.map +1 -0
- package/dist/hook/hook-tx.js +26 -0
- package/dist/hook/hook-tx.js.map +1 -0
- package/dist/hook/igp-hook.d.ts +24 -0
- package/dist/hook/igp-hook.d.ts.map +1 -0
- package/dist/hook/igp-hook.js +148 -0
- package/dist/hook/igp-hook.js.map +1 -0
- package/dist/hook/merkle-tree-hook.d.ts +24 -0
- package/dist/hook/merkle-tree-hook.d.ts.map +1 -0
- package/dist/hook/merkle-tree-hook.js +51 -0
- package/dist/hook/merkle-tree-hook.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/ism/ism-artifact-manager.d.ts +14 -0
- package/dist/ism/ism-artifact-manager.d.ts.map +1 -0
- package/dist/ism/ism-artifact-manager.js +67 -0
- package/dist/ism/ism-artifact-manager.js.map +1 -0
- package/dist/ism/ism-query.d.ts +23 -0
- package/dist/ism/ism-query.d.ts.map +1 -0
- package/dist/ism/ism-query.js +84 -0
- package/dist/ism/ism-query.js.map +1 -0
- package/dist/ism/ism-tx.d.ts +31 -0
- package/dist/ism/ism-tx.d.ts.map +1 -0
- package/dist/ism/ism-tx.js +43 -0
- package/dist/ism/ism-tx.js.map +1 -0
- package/dist/ism/multisig-ism.d.ts +38 -0
- package/dist/ism/multisig-ism.d.ts.map +1 -0
- package/dist/ism/multisig-ism.js +107 -0
- package/dist/ism/multisig-ism.js.map +1 -0
- package/dist/ism/routing-ism.d.ts +23 -0
- package/dist/ism/routing-ism.d.ts.map +1 -0
- package/dist/ism/routing-ism.js +129 -0
- package/dist/ism/routing-ism.js.map +1 -0
- package/dist/ism/test-ism.d.ts +23 -0
- package/dist/ism/test-ism.d.ts.map +1 -0
- package/dist/ism/test-ism.js +49 -0
- package/dist/ism/test-ism.js.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.d.ts +15 -0
- package/dist/mailbox/mailbox-artifact-manager.d.ts.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.js +29 -0
- package/dist/mailbox/mailbox-artifact-manager.js.map +1 -0
- package/dist/mailbox/mailbox-query.d.ts +12 -0
- package/dist/mailbox/mailbox-query.d.ts.map +1 -0
- package/dist/mailbox/mailbox-query.js +72 -0
- package/dist/mailbox/mailbox-query.js.map +1 -0
- package/dist/mailbox/mailbox-query.test.d.ts +2 -0
- package/dist/mailbox/mailbox-query.test.d.ts.map +1 -0
- package/dist/mailbox/mailbox-query.test.js +65 -0
- package/dist/mailbox/mailbox-query.test.js.map +1 -0
- package/dist/mailbox/mailbox-tx.d.ts +21 -0
- package/dist/mailbox/mailbox-tx.d.ts.map +1 -0
- package/dist/mailbox/mailbox-tx.js +27 -0
- package/dist/mailbox/mailbox-tx.js.map +1 -0
- package/dist/mailbox/mailbox.d.ts +24 -0
- package/dist/mailbox/mailbox.d.ts.map +1 -0
- package/dist/mailbox/mailbox.js +171 -0
- package/dist/mailbox/mailbox.js.map +1 -0
- package/dist/runtime.d.ts +7 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +6 -0
- package/dist/runtime.js.map +1 -0
- package/dist/testing/constants.d.ts +61 -0
- package/dist/testing/constants.d.ts.map +1 -0
- package/dist/testing/constants.js +65 -0
- package/dist/testing/constants.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/node.d.ts +13 -0
- package/dist/testing/node.d.ts.map +1 -0
- package/dist/testing/node.js +42 -0
- package/dist/testing/node.js.map +1 -0
- package/dist/testing/setup.d.ts +20 -0
- package/dist/testing/setup.d.ts.map +1 -0
- package/dist/testing/setup.js +57 -0
- package/dist/testing/setup.js.map +1 -0
- package/dist/tests/e2e-test.setup.d.ts +3 -0
- package/dist/tests/e2e-test.setup.d.ts.map +1 -0
- package/dist/tests/e2e-test.setup.js +32 -0
- package/dist/tests/e2e-test.setup.js.map +1 -0
- package/dist/tests/hook.e2e-test.d.ts +2 -0
- package/dist/tests/hook.e2e-test.d.ts.map +1 -0
- package/dist/tests/hook.e2e-test.js +374 -0
- package/dist/tests/hook.e2e-test.js.map +1 -0
- package/dist/tests/ism.e2e-test.d.ts +2 -0
- package/dist/tests/ism.e2e-test.d.ts.map +1 -0
- package/dist/tests/ism.e2e-test.js +256 -0
- package/dist/tests/ism.e2e-test.js.map +1 -0
- package/dist/tests/mailbox.e2e-test.d.ts +2 -0
- package/dist/tests/mailbox.e2e-test.d.ts.map +1 -0
- package/dist/tests/mailbox.e2e-test.js +250 -0
- package/dist/tests/mailbox.e2e-test.js.map +1 -0
- package/dist/tests/validator-announce.e2e-test.d.ts +2 -0
- package/dist/tests/validator-announce.e2e-test.d.ts.map +1 -0
- package/dist/tests/validator-announce.e2e-test.js +107 -0
- package/dist/tests/validator-announce.e2e-test.js.map +1 -0
- package/dist/tests/warp.e2e-test.d.ts +2 -0
- package/dist/tests/warp.e2e-test.d.ts.map +1 -0
- package/dist/tests/warp.e2e-test.js +597 -0
- package/dist/tests/warp.e2e-test.js.map +1 -0
- package/dist/utils/base-query.d.ts +188 -0
- package/dist/utils/base-query.d.ts.map +1 -0
- package/dist/utils/base-query.js +209 -0
- package/dist/utils/base-query.js.map +1 -0
- package/dist/utils/base.d.ts +67 -0
- package/dist/utils/base.d.ts.map +1 -0
- package/dist/utils/base.js +355 -0
- package/dist/utils/base.js.map +1 -0
- package/dist/utils/constants.d.ts +20 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +20 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/signer.d.ts +17 -0
- package/dist/utils/signer.d.ts.map +1 -0
- package/dist/utils/signer.js +60 -0
- package/dist/utils/signer.js.map +1 -0
- package/dist/utils/types.d.ts +141 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +39 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/utils.d.ts +8 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +47 -0
- package/dist/utils/utils.js.map +1 -0
- package/dist/utils/utils.test.d.ts +2 -0
- package/dist/utils/utils.test.d.ts.map +1 -0
- package/dist/utils/utils.test.js +27 -0
- package/dist/utils/utils.test.js.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.d.ts +14 -0
- package/dist/validator-announce/validator-announce-artifact-manager.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.js +21 -0
- package/dist/validator-announce/validator-announce-artifact-manager.js.map +1 -0
- package/dist/validator-announce/validator-announce-query.d.ts +6 -0
- package/dist/validator-announce/validator-announce-query.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-query.js +10 -0
- package/dist/validator-announce/validator-announce-query.js.map +1 -0
- package/dist/validator-announce/validator-announce-tx.d.ts +4 -0
- package/dist/validator-announce/validator-announce-tx.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-tx.js +6 -0
- package/dist/validator-announce/validator-announce-tx.js.map +1 -0
- package/dist/validator-announce/validator-announce.d.ts +23 -0
- package/dist/validator-announce/validator-announce.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce.js +52 -0
- package/dist/validator-announce/validator-announce.js.map +1 -0
- package/dist/warp/collateral-token.d.ts +23 -0
- package/dist/warp/collateral-token.d.ts.map +1 -0
- package/dist/warp/collateral-token.js +130 -0
- package/dist/warp/collateral-token.js.map +1 -0
- package/dist/warp/populate.d.ts +71 -0
- package/dist/warp/populate.d.ts.map +1 -0
- package/dist/warp/populate.js +110 -0
- package/dist/warp/populate.js.map +1 -0
- package/dist/warp/query.d.ts +44 -0
- package/dist/warp/query.d.ts.map +1 -0
- package/dist/warp/query.js +163 -0
- package/dist/warp/query.js.map +1 -0
- package/dist/warp/synthetic-token.d.ts +23 -0
- package/dist/warp/synthetic-token.d.ts.map +1 -0
- package/dist/warp/synthetic-token.js +131 -0
- package/dist/warp/synthetic-token.js.map +1 -0
- package/dist/warp/warp-artifact-manager.d.ts +15 -0
- package/dist/warp/warp-artifact-manager.d.ts.map +1 -0
- package/dist/warp/warp-artifact-manager.js +49 -0
- package/dist/warp/warp-artifact-manager.js.map +1 -0
- package/dist/warp/warp-query.d.ts +9 -0
- package/dist/warp/warp-query.d.ts.map +1 -0
- package/dist/warp/warp-query.js +130 -0
- package/dist/warp/warp-query.js.map +1 -0
- package/dist/warp/warp-tx.d.ts +48 -0
- package/dist/warp/warp-tx.d.ts.map +1 -0
- package/dist/warp/warp-tx.js +125 -0
- package/dist/warp/warp-tx.js.map +1 -0
- package/docker-compose.yml +139 -0
- 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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"}
|