@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,374 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { AltVM } from '@recoillink/provider-sdk';
|
|
3
|
+
import { ArtifactState, } from '@recoillink/provider-sdk/artifact';
|
|
4
|
+
import { assert, eqAddressRadix } from '@recoillink/utils';
|
|
5
|
+
import { RadixSigner } from '../clients/signer.js';
|
|
6
|
+
import { RadixHookArtifactManager } from '../hook/hook-artifact-manager.js';
|
|
7
|
+
import { DEFAULT_E2E_TEST_TIMEOUT, TEST_RADIX_BURN_ADDRESS, TEST_RADIX_DEPLOYER_ADDRESS, TEST_RADIX_PRIVATE_KEY, } from '../testing/constants.js';
|
|
8
|
+
import { DEPLOYED_TEST_CHAIN_METADATA } from './e2e-test.setup.js';
|
|
9
|
+
describe('Radix Hooks (e2e)', function () {
|
|
10
|
+
this.timeout(DEFAULT_E2E_TEST_TIMEOUT);
|
|
11
|
+
let radixSigner;
|
|
12
|
+
let providerSdkSigner;
|
|
13
|
+
let artifactManager;
|
|
14
|
+
const DOMAIN_1 = 42;
|
|
15
|
+
const DOMAIN_2 = 96;
|
|
16
|
+
before(async () => {
|
|
17
|
+
radixSigner = await RadixSigner.connectWithSigner(DEPLOYED_TEST_CHAIN_METADATA, TEST_RADIX_PRIVATE_KEY);
|
|
18
|
+
providerSdkSigner = radixSigner;
|
|
19
|
+
const gateway = radixSigner.gateway;
|
|
20
|
+
const base = radixSigner.base;
|
|
21
|
+
const nativeTokenDenom = DEPLOYED_TEST_CHAIN_METADATA.nativeToken?.denom ?? 'xrd';
|
|
22
|
+
// Use deployer address as mailbox for testing purposes
|
|
23
|
+
const mailboxAddress = TEST_RADIX_DEPLOYER_ADDRESS;
|
|
24
|
+
artifactManager = new RadixHookArtifactManager(gateway, base, mailboxAddress, nativeTokenDenom);
|
|
25
|
+
});
|
|
26
|
+
describe('MerkleTree Hook', () => {
|
|
27
|
+
it('should create a MerkleTree hook', async () => {
|
|
28
|
+
const config = {
|
|
29
|
+
type: AltVM.HookType.MERKLE_TREE,
|
|
30
|
+
};
|
|
31
|
+
const writer = artifactManager.createWriter(AltVM.HookType.MERKLE_TREE, radixSigner);
|
|
32
|
+
const [result, receipts] = await writer.create({ config });
|
|
33
|
+
expect(result.artifactState).to.equal(ArtifactState.DEPLOYED);
|
|
34
|
+
expect(result.config.type).to.equal(AltVM.HookType.MERKLE_TREE);
|
|
35
|
+
expect(result.deployed.address).to.be.a('string').and.not.be.empty;
|
|
36
|
+
expect(receipts).to.be.an('array').with.length.greaterThan(0);
|
|
37
|
+
});
|
|
38
|
+
it('should read a MerkleTree hook', async () => {
|
|
39
|
+
const config = {
|
|
40
|
+
type: AltVM.HookType.MERKLE_TREE,
|
|
41
|
+
};
|
|
42
|
+
const writer = artifactManager.createWriter(AltVM.HookType.MERKLE_TREE, radixSigner);
|
|
43
|
+
const [deployedHook] = await writer.create({ config });
|
|
44
|
+
const reader = artifactManager.createReader(AltVM.HookType.MERKLE_TREE);
|
|
45
|
+
const readHook = await reader.read(deployedHook.deployed.address);
|
|
46
|
+
expect(readHook.artifactState).to.equal(ArtifactState.DEPLOYED);
|
|
47
|
+
expect(readHook.config.type).to.equal(AltVM.HookType.MERKLE_TREE);
|
|
48
|
+
expect(readHook.deployed.address).to.equal(deployedHook.deployed.address);
|
|
49
|
+
});
|
|
50
|
+
it('should return no transactions when calling update on MerkleTree hook', async () => {
|
|
51
|
+
const config = {
|
|
52
|
+
type: AltVM.HookType.MERKLE_TREE,
|
|
53
|
+
};
|
|
54
|
+
const writer = artifactManager.createWriter(AltVM.HookType.MERKLE_TREE, radixSigner);
|
|
55
|
+
const [deployedHook] = await writer.create({ config });
|
|
56
|
+
// MerkleTree hooks are immutable
|
|
57
|
+
const txs = await writer.update(deployedHook);
|
|
58
|
+
expect(txs).to.be.an('array').with.length(0);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('IGP Hook', () => {
|
|
62
|
+
it('should create an IGP hook', async () => {
|
|
63
|
+
const config = {
|
|
64
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
65
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
66
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
67
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
68
|
+
overhead: {
|
|
69
|
+
[DOMAIN_1]: 50000,
|
|
70
|
+
[DOMAIN_2]: 100000,
|
|
71
|
+
},
|
|
72
|
+
oracleConfig: {
|
|
73
|
+
[DOMAIN_1]: {
|
|
74
|
+
gasPrice: '1000000000',
|
|
75
|
+
tokenExchangeRate: '10000000000',
|
|
76
|
+
},
|
|
77
|
+
[DOMAIN_2]: {
|
|
78
|
+
gasPrice: '2000000000',
|
|
79
|
+
tokenExchangeRate: '15000000000',
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
84
|
+
const [result, receipts] = await writer.create({ config });
|
|
85
|
+
expect(result.artifactState).to.equal(ArtifactState.DEPLOYED);
|
|
86
|
+
expect(result.config.type).to.equal(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
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
|
+
});
|
|
90
|
+
it('should read an IGP hook', async () => {
|
|
91
|
+
const config = {
|
|
92
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
93
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
94
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
95
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
96
|
+
overhead: {
|
|
97
|
+
[DOMAIN_1]: 50000,
|
|
98
|
+
},
|
|
99
|
+
oracleConfig: {
|
|
100
|
+
[DOMAIN_1]: {
|
|
101
|
+
gasPrice: '1000000000',
|
|
102
|
+
tokenExchangeRate: '10000000000',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
107
|
+
const [deployedHook] = await writer.create({ config });
|
|
108
|
+
const reader = artifactManager.createReader(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
109
|
+
const readHook = await reader.read(deployedHook.deployed.address);
|
|
110
|
+
expect(readHook.artifactState).to.equal(ArtifactState.DEPLOYED);
|
|
111
|
+
expect(readHook.config.type).to.equal(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
112
|
+
expect(readHook.deployed.address).to.equal(deployedHook.deployed.address);
|
|
113
|
+
// Verify config matches (excluding beneficiary/oracleKey which are placeholders)
|
|
114
|
+
expect(readHook.config.owner).to.equal(config.owner);
|
|
115
|
+
expect(readHook.config.overhead).to.deep.equal(config.overhead);
|
|
116
|
+
// Verify oracle config (note: tokenDecimals is not stored on-chain for Radix)
|
|
117
|
+
const readOracleConfig = readHook.config.oracleConfig[DOMAIN_1];
|
|
118
|
+
const expectedOracleConfig = config.oracleConfig[DOMAIN_1];
|
|
119
|
+
assert(readOracleConfig, `Missing oracle config for domain ${DOMAIN_1}`);
|
|
120
|
+
assert(expectedOracleConfig, `Missing expected oracle config for domain ${DOMAIN_1}`);
|
|
121
|
+
expect(readOracleConfig.gasPrice).to.equal(expectedOracleConfig.gasPrice);
|
|
122
|
+
expect(readOracleConfig.tokenExchangeRate).to.equal(expectedOracleConfig.tokenExchangeRate);
|
|
123
|
+
});
|
|
124
|
+
it('should create IGP hook with specified owner different from signer', async () => {
|
|
125
|
+
const config = {
|
|
126
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
127
|
+
owner: TEST_RADIX_BURN_ADDRESS, // Different from signer
|
|
128
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
129
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
130
|
+
overhead: {
|
|
131
|
+
[DOMAIN_1]: 50000,
|
|
132
|
+
},
|
|
133
|
+
oracleConfig: {
|
|
134
|
+
[DOMAIN_1]: {
|
|
135
|
+
gasPrice: '1000000000',
|
|
136
|
+
tokenExchangeRate: '10000000000',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
141
|
+
const [deployedHook] = await writer.create({ config });
|
|
142
|
+
const reader = artifactManager.createReader(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
143
|
+
const readHook = await reader.read(deployedHook.deployed.address);
|
|
144
|
+
// Verify ownership was transferred
|
|
145
|
+
expect(eqAddressRadix(readHook.config.owner, TEST_RADIX_BURN_ADDRESS)).to
|
|
146
|
+
.be.true;
|
|
147
|
+
});
|
|
148
|
+
it('should update IGP hook gas configs', async () => {
|
|
149
|
+
const initialConfig = {
|
|
150
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
151
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
152
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
153
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
154
|
+
overhead: {
|
|
155
|
+
[DOMAIN_1]: 50000,
|
|
156
|
+
},
|
|
157
|
+
oracleConfig: {
|
|
158
|
+
[DOMAIN_1]: {
|
|
159
|
+
gasPrice: '1000000000',
|
|
160
|
+
tokenExchangeRate: '10000000000',
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
165
|
+
const [deployedHook] = await writer.create({ config: initialConfig });
|
|
166
|
+
// Update with new gas config
|
|
167
|
+
const updatedConfig = {
|
|
168
|
+
...deployedHook,
|
|
169
|
+
config: {
|
|
170
|
+
...deployedHook.config,
|
|
171
|
+
overhead: {
|
|
172
|
+
[DOMAIN_1]: 60000, // Changed
|
|
173
|
+
[DOMAIN_2]: 100000, // New domain
|
|
174
|
+
},
|
|
175
|
+
oracleConfig: {
|
|
176
|
+
[DOMAIN_1]: {
|
|
177
|
+
gasPrice: '2000000000', // Changed
|
|
178
|
+
tokenExchangeRate: '12000000000', // Changed
|
|
179
|
+
},
|
|
180
|
+
[DOMAIN_2]: {
|
|
181
|
+
gasPrice: '3000000000',
|
|
182
|
+
tokenExchangeRate: '15000000000',
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
const txs = await writer.update(updatedConfig);
|
|
188
|
+
expect(txs).to.be.an('array').with.length.greaterThan(0);
|
|
189
|
+
// Execute the update transactions
|
|
190
|
+
for (const tx of txs) {
|
|
191
|
+
await providerSdkSigner.sendAndConfirmTransaction(tx);
|
|
192
|
+
}
|
|
193
|
+
// Verify the updates
|
|
194
|
+
const reader = artifactManager.createReader(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
195
|
+
const readHook = await reader.read(deployedHook.deployed.address);
|
|
196
|
+
expect(readHook.config.overhead[DOMAIN_1]).to.equal(60000);
|
|
197
|
+
expect(readHook.config.overhead[DOMAIN_2]).to.equal(100000);
|
|
198
|
+
const domain1OracleConfig = readHook.config.oracleConfig[DOMAIN_1];
|
|
199
|
+
const domain2OracleConfig = readHook.config.oracleConfig[DOMAIN_2];
|
|
200
|
+
assert(domain1OracleConfig, `Missing oracle config for domain ${DOMAIN_1}`);
|
|
201
|
+
assert(domain2OracleConfig, `Missing oracle config for domain ${DOMAIN_2}`);
|
|
202
|
+
expect(domain1OracleConfig.gasPrice).to.equal('2000000000');
|
|
203
|
+
expect(domain2OracleConfig.gasPrice).to.equal('3000000000');
|
|
204
|
+
});
|
|
205
|
+
it('should transfer ownership of IGP hook via update', async () => {
|
|
206
|
+
const initialConfig = {
|
|
207
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
208
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
209
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
210
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
211
|
+
overhead: {
|
|
212
|
+
[DOMAIN_1]: 50000,
|
|
213
|
+
},
|
|
214
|
+
oracleConfig: {
|
|
215
|
+
[DOMAIN_1]: {
|
|
216
|
+
gasPrice: '1000000000',
|
|
217
|
+
tokenExchangeRate: '10000000000',
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
222
|
+
const [deployedHook] = await writer.create({ config: initialConfig });
|
|
223
|
+
// Update ownership
|
|
224
|
+
const updatedConfig = {
|
|
225
|
+
...deployedHook,
|
|
226
|
+
config: {
|
|
227
|
+
...deployedHook.config,
|
|
228
|
+
owner: TEST_RADIX_BURN_ADDRESS,
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
const txs = await writer.update(updatedConfig);
|
|
232
|
+
expect(txs).to.be.an('array').with.length.greaterThan(0);
|
|
233
|
+
// Execute the update transactions
|
|
234
|
+
for (const tx of txs) {
|
|
235
|
+
await providerSdkSigner.sendAndConfirmTransaction(tx);
|
|
236
|
+
}
|
|
237
|
+
// Verify ownership transfer
|
|
238
|
+
const reader = artifactManager.createReader(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
239
|
+
const readHook = await reader.read(deployedHook.deployed.address);
|
|
240
|
+
expect(eqAddressRadix(readHook.config.owner, TEST_RADIX_BURN_ADDRESS)).to
|
|
241
|
+
.be.true;
|
|
242
|
+
});
|
|
243
|
+
it('should return no update transactions when config is unchanged', async () => {
|
|
244
|
+
const config = {
|
|
245
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
246
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
247
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
248
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
249
|
+
overhead: {
|
|
250
|
+
[DOMAIN_1]: 50000,
|
|
251
|
+
},
|
|
252
|
+
oracleConfig: {
|
|
253
|
+
[DOMAIN_1]: {
|
|
254
|
+
gasPrice: '1000000000',
|
|
255
|
+
tokenExchangeRate: '10000000000',
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
260
|
+
const [deployedHook] = await writer.create({ config });
|
|
261
|
+
// Try to update with same config
|
|
262
|
+
const txs = await writer.update(deployedHook);
|
|
263
|
+
expect(txs).to.be.an('array').with.length(0);
|
|
264
|
+
});
|
|
265
|
+
it('should update gas configs AND transfer ownership (ownership last)', async () => {
|
|
266
|
+
// This test exposes the bug where ownership transfer happens before gas config updates
|
|
267
|
+
// The ownership transfer MUST be the last transaction, otherwise the gas config
|
|
268
|
+
// updates will fail because the signer is no longer the owner
|
|
269
|
+
const initialConfig = {
|
|
270
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
271
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
272
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
273
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
274
|
+
overhead: {
|
|
275
|
+
[DOMAIN_1]: 50000,
|
|
276
|
+
},
|
|
277
|
+
oracleConfig: {
|
|
278
|
+
[DOMAIN_1]: {
|
|
279
|
+
gasPrice: '1000000000',
|
|
280
|
+
tokenExchangeRate: '10000000000',
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
285
|
+
const [deployedHook] = await writer.create({ config: initialConfig });
|
|
286
|
+
// Update BOTH gas config AND ownership
|
|
287
|
+
const updatedConfig = {
|
|
288
|
+
...deployedHook,
|
|
289
|
+
config: {
|
|
290
|
+
...deployedHook.config,
|
|
291
|
+
owner: TEST_RADIX_BURN_ADDRESS, // Transfer ownership
|
|
292
|
+
overhead: {
|
|
293
|
+
[DOMAIN_1]: 60000, // Also update gas config
|
|
294
|
+
[DOMAIN_2]: 100000, // Add new domain
|
|
295
|
+
},
|
|
296
|
+
oracleConfig: {
|
|
297
|
+
[DOMAIN_1]: {
|
|
298
|
+
gasPrice: '2000000000', // Changed
|
|
299
|
+
tokenExchangeRate: '12000000000', // Changed
|
|
300
|
+
},
|
|
301
|
+
[DOMAIN_2]: {
|
|
302
|
+
gasPrice: '3000000000',
|
|
303
|
+
tokenExchangeRate: '15000000000',
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
const txs = await writer.update(updatedConfig);
|
|
309
|
+
expect(txs).to.be.an('array').with.length.greaterThan(0);
|
|
310
|
+
// Verify ownership transfer is the LAST transaction
|
|
311
|
+
const lastTx = txs[txs.length - 1];
|
|
312
|
+
assert(lastTx, 'Expected at least one update transaction');
|
|
313
|
+
expect(lastTx.annotation).to.include('owner');
|
|
314
|
+
// Execute all transactions - this will fail if ownership transfer is not last
|
|
315
|
+
for (const tx of txs) {
|
|
316
|
+
await providerSdkSigner.sendAndConfirmTransaction(tx);
|
|
317
|
+
}
|
|
318
|
+
// Verify both gas config updates AND ownership transfer succeeded
|
|
319
|
+
const reader = artifactManager.createReader(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
320
|
+
const readHook = await reader.read(deployedHook.deployed.address);
|
|
321
|
+
// Verify gas configs were updated
|
|
322
|
+
expect(readHook.config.overhead[DOMAIN_1]).to.equal(60000);
|
|
323
|
+
expect(readHook.config.overhead[DOMAIN_2]).to.equal(100000);
|
|
324
|
+
const domain1OracleConfig = readHook.config.oracleConfig[DOMAIN_1];
|
|
325
|
+
const domain2OracleConfig = readHook.config.oracleConfig[DOMAIN_2];
|
|
326
|
+
assert(domain1OracleConfig, `Missing oracle config for domain ${DOMAIN_1}`);
|
|
327
|
+
assert(domain2OracleConfig, `Missing oracle config for domain ${DOMAIN_2}`);
|
|
328
|
+
expect(domain1OracleConfig.gasPrice).to.equal('2000000000');
|
|
329
|
+
expect(domain2OracleConfig.gasPrice).to.equal('3000000000');
|
|
330
|
+
// Verify ownership was transferred
|
|
331
|
+
expect(eqAddressRadix(readHook.config.owner, TEST_RADIX_BURN_ADDRESS)).to
|
|
332
|
+
.be.true;
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
describe('Generic hook reading via readHook', () => {
|
|
336
|
+
it('should detect and read MerkleTree hook', async () => {
|
|
337
|
+
const config = {
|
|
338
|
+
type: AltVM.HookType.MERKLE_TREE,
|
|
339
|
+
};
|
|
340
|
+
const writer = artifactManager.createWriter(AltVM.HookType.MERKLE_TREE, radixSigner);
|
|
341
|
+
const [deployedHook] = await writer.create({ config });
|
|
342
|
+
// Read via generic readHook (without knowing the type)
|
|
343
|
+
const readHook = await artifactManager.readHook(deployedHook.deployed.address);
|
|
344
|
+
expect(readHook.artifactState).to.equal(ArtifactState.DEPLOYED);
|
|
345
|
+
expect(readHook.config.type).to.equal(AltVM.HookType.MERKLE_TREE);
|
|
346
|
+
expect(readHook.deployed.address).to.equal(deployedHook.deployed.address);
|
|
347
|
+
});
|
|
348
|
+
it('should detect and read IGP hook', async () => {
|
|
349
|
+
const config = {
|
|
350
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
351
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
352
|
+
beneficiary: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
353
|
+
oracleKey: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
354
|
+
overhead: {
|
|
355
|
+
[DOMAIN_1]: 50000,
|
|
356
|
+
},
|
|
357
|
+
oracleConfig: {
|
|
358
|
+
[DOMAIN_1]: {
|
|
359
|
+
gasPrice: '1000000000',
|
|
360
|
+
tokenExchangeRate: '10000000000',
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
const writer = artifactManager.createWriter(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER, radixSigner);
|
|
365
|
+
const [deployedHook] = await writer.create({ config });
|
|
366
|
+
// Read via generic readHook (without knowing the type)
|
|
367
|
+
const readHook = await artifactManager.readHook(deployedHook.deployed.address);
|
|
368
|
+
expect(readHook.artifactState).to.equal(ArtifactState.DEPLOYED);
|
|
369
|
+
expect(readHook.config.type).to.equal(AltVM.HookType.INTERCHAIN_GAS_PAYMASTER);
|
|
370
|
+
expect(readHook.deployed.address).to.equal(deployedHook.deployed.address);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
//# sourceMappingURL=hook.e2e-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.e2e-test.js","sourceRoot":"","sources":["../../src/tests/hook.e2e-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ism.e2e-test.d.ts","sourceRoot":"","sources":["../../src/tests/ism.e2e-test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { AltVM } from '@recoillink/provider-sdk';
|
|
3
|
+
import { ArtifactState, } from '@recoillink/provider-sdk/artifact';
|
|
4
|
+
import { assert, normalizeConfig } from '@recoillink/utils';
|
|
5
|
+
import { RadixSigner } from '../clients/signer.js';
|
|
6
|
+
import { RadixIsmArtifactManager } from '../ism/ism-artifact-manager.js';
|
|
7
|
+
import { DEFAULT_E2E_TEST_TIMEOUT, TEST_RADIX_BURN_ADDRESS, TEST_RADIX_DEPLOYER_ADDRESS, TEST_RADIX_PRIVATE_KEY, } from '../testing/constants.js';
|
|
8
|
+
import { DEPLOYED_TEST_CHAIN_METADATA } from './e2e-test.setup.js';
|
|
9
|
+
describe('Radix ISMs (e2e)', function () {
|
|
10
|
+
this.timeout(DEFAULT_E2E_TEST_TIMEOUT);
|
|
11
|
+
let radixSigner;
|
|
12
|
+
let providerSdkSigner;
|
|
13
|
+
let artifactManager;
|
|
14
|
+
before(async () => {
|
|
15
|
+
radixSigner = await RadixSigner.connectWithSigner(DEPLOYED_TEST_CHAIN_METADATA, TEST_RADIX_PRIVATE_KEY);
|
|
16
|
+
providerSdkSigner = radixSigner;
|
|
17
|
+
const gateway = radixSigner.gateway;
|
|
18
|
+
const base = radixSigner.base;
|
|
19
|
+
artifactManager = new RadixIsmArtifactManager(gateway, base);
|
|
20
|
+
});
|
|
21
|
+
describe('Non composite ISMs', () => {
|
|
22
|
+
const validators = [
|
|
23
|
+
'0x3C24F29fa75869A1C9D19d9d6589Aae0B5227c3c',
|
|
24
|
+
'0xf719b4CC64d0E3a380e52c2720Abab13835F6d9c',
|
|
25
|
+
'0x98A56EdE1d6Dd386216DA8217D9ac1d2EE7c27c7',
|
|
26
|
+
];
|
|
27
|
+
const testCases = [
|
|
28
|
+
{
|
|
29
|
+
name: 'Test ISM',
|
|
30
|
+
type: AltVM.IsmType.TEST_ISM,
|
|
31
|
+
config: { type: AltVM.IsmType.TEST_ISM },
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'MessageId Multisig ISM',
|
|
35
|
+
type: AltVM.IsmType.MESSAGE_ID_MULTISIG,
|
|
36
|
+
config: {
|
|
37
|
+
type: AltVM.IsmType.MESSAGE_ID_MULTISIG,
|
|
38
|
+
validators,
|
|
39
|
+
threshold: 2,
|
|
40
|
+
},
|
|
41
|
+
verifyConfig: (config) => {
|
|
42
|
+
expect(normalizeConfig(config)).to.deep.equal(normalizeConfig({
|
|
43
|
+
type: AltVM.IsmType.MESSAGE_ID_MULTISIG,
|
|
44
|
+
validators,
|
|
45
|
+
threshold: 2,
|
|
46
|
+
}));
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'MerkleRoot Multisig ISM',
|
|
51
|
+
type: AltVM.IsmType.MERKLE_ROOT_MULTISIG,
|
|
52
|
+
config: {
|
|
53
|
+
type: AltVM.IsmType.MERKLE_ROOT_MULTISIG,
|
|
54
|
+
validators,
|
|
55
|
+
threshold: 2,
|
|
56
|
+
},
|
|
57
|
+
verifyConfig: (config) => {
|
|
58
|
+
expect(normalizeConfig(config)).to.deep.equal(normalizeConfig({
|
|
59
|
+
type: AltVM.IsmType.MERKLE_ROOT_MULTISIG,
|
|
60
|
+
validators,
|
|
61
|
+
threshold: 2,
|
|
62
|
+
}));
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
testCases.forEach(({ name, type, config, verifyConfig }) => {
|
|
67
|
+
describe(name, () => {
|
|
68
|
+
it(`should create a ${type}`, async () => {
|
|
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
|
+
});
|
|
76
|
+
it(`should read a ${type}`, async () => {
|
|
77
|
+
const writer = artifactManager.createWriter(type, radixSigner);
|
|
78
|
+
const [deployedIsm] = await writer.create({ config });
|
|
79
|
+
const reader = artifactManager.createReader(type);
|
|
80
|
+
const readIsm = await reader.read(deployedIsm.deployed.address);
|
|
81
|
+
expect(readIsm.artifactState).to.equal(ArtifactState.DEPLOYED);
|
|
82
|
+
expect(readIsm.config.type).to.equal(type);
|
|
83
|
+
expect(readIsm.deployed.address).to.equal(deployedIsm.deployed.address);
|
|
84
|
+
if (verifyConfig) {
|
|
85
|
+
verifyConfig(readIsm.config);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
it('should return no transactions when calling update', async () => {
|
|
89
|
+
const writer = artifactManager.createWriter(type, radixSigner);
|
|
90
|
+
const [deployedIsm] = await writer.create({ config });
|
|
91
|
+
const txs = await writer.update(deployedIsm);
|
|
92
|
+
expect(txs).to.be.an('array').with.length(0);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe(AltVM.IsmType.ROUTING, () => {
|
|
98
|
+
let testIsmAddress;
|
|
99
|
+
let multisigIsmAddress;
|
|
100
|
+
const DOMAIN_1 = 42;
|
|
101
|
+
const DOMAIN_2 = 96;
|
|
102
|
+
const DOMAIN_3 = 100;
|
|
103
|
+
let config;
|
|
104
|
+
let routingIsmWriter;
|
|
105
|
+
before(async () => {
|
|
106
|
+
const testWriter = artifactManager.createWriter(AltVM.IsmType.TEST_ISM, radixSigner);
|
|
107
|
+
const [testIsm] = await testWriter.create({
|
|
108
|
+
config: { type: AltVM.IsmType.TEST_ISM },
|
|
109
|
+
});
|
|
110
|
+
testIsmAddress = testIsm.deployed.address;
|
|
111
|
+
const multisigWriter = artifactManager.createWriter(AltVM.IsmType.MESSAGE_ID_MULTISIG, radixSigner);
|
|
112
|
+
const [multisigIsm] = await multisigWriter.create({
|
|
113
|
+
config: {
|
|
114
|
+
type: AltVM.IsmType.MESSAGE_ID_MULTISIG,
|
|
115
|
+
validators: ['0x3C24F29fa75869A1C9D19d9d6589Aae0B5227c3c'],
|
|
116
|
+
threshold: 1,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
multisigIsmAddress = multisigIsm.deployed.address;
|
|
120
|
+
config = {
|
|
121
|
+
type: AltVM.IsmType.ROUTING,
|
|
122
|
+
owner: TEST_RADIX_DEPLOYER_ADDRESS,
|
|
123
|
+
domains: {
|
|
124
|
+
[DOMAIN_1]: {
|
|
125
|
+
artifactState: ArtifactState.UNDERIVED,
|
|
126
|
+
deployed: { address: testIsmAddress },
|
|
127
|
+
},
|
|
128
|
+
[DOMAIN_2]: {
|
|
129
|
+
artifactState: ArtifactState.UNDERIVED,
|
|
130
|
+
deployed: { address: multisigIsmAddress },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
routingIsmWriter = artifactManager.createWriter(AltVM.IsmType.ROUTING, radixSigner);
|
|
135
|
+
});
|
|
136
|
+
it('should create and read the provided config', async () => {
|
|
137
|
+
const [routingIsm] = await routingIsmWriter.create({ config });
|
|
138
|
+
const reader = artifactManager.createReader(AltVM.IsmType.ROUTING);
|
|
139
|
+
const readIsm = await reader.read(routingIsm.deployed.address);
|
|
140
|
+
expect(readIsm.config.type).to.equal(AltVM.IsmType.ROUTING);
|
|
141
|
+
expect(readIsm.config.owner).to.equal(TEST_RADIX_DEPLOYER_ADDRESS);
|
|
142
|
+
expect(Object.keys(readIsm.config.domains)).to.have.length(2);
|
|
143
|
+
const domain1Ism = readIsm.config.domains[DOMAIN_1];
|
|
144
|
+
const domain2Ism = readIsm.config.domains[DOMAIN_2];
|
|
145
|
+
assert(domain1Ism, `Missing ISM for domain ${DOMAIN_1}`);
|
|
146
|
+
assert(domain2Ism, `Missing ISM for domain ${DOMAIN_2}`);
|
|
147
|
+
expect(domain1Ism.deployed.address).to.equal(testIsmAddress);
|
|
148
|
+
expect(domain2Ism.deployed.address).to.equal(multisigIsmAddress);
|
|
149
|
+
});
|
|
150
|
+
it('should add a new domain ISM', async () => {
|
|
151
|
+
const [routingIsm] = await routingIsmWriter.create({ config });
|
|
152
|
+
const updatedConfig = {
|
|
153
|
+
...routingIsm,
|
|
154
|
+
config: {
|
|
155
|
+
...routingIsm.config,
|
|
156
|
+
domains: {
|
|
157
|
+
...routingIsm.config.domains,
|
|
158
|
+
[DOMAIN_3]: {
|
|
159
|
+
artifactState: ArtifactState.UNDERIVED,
|
|
160
|
+
deployed: { address: testIsmAddress },
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
const txs = await routingIsmWriter.update(updatedConfig);
|
|
166
|
+
expect(txs).to.be.an('array').with.length.greaterThan(0);
|
|
167
|
+
const [firstTx] = txs;
|
|
168
|
+
assert(firstTx, 'Expected at least one update transaction');
|
|
169
|
+
expect(firstTx.annotation).to.include(`domain ${DOMAIN_3}`);
|
|
170
|
+
for (const tx of txs) {
|
|
171
|
+
await providerSdkSigner.sendAndConfirmTransaction(tx);
|
|
172
|
+
}
|
|
173
|
+
const reader = artifactManager.createReader(AltVM.IsmType.ROUTING);
|
|
174
|
+
const readIsm = await reader.read(routingIsm.deployed.address);
|
|
175
|
+
const domain3Ism = readIsm.config.domains[DOMAIN_3];
|
|
176
|
+
assert(domain3Ism, `Missing ISM for domain ${DOMAIN_3}`);
|
|
177
|
+
expect(domain3Ism.deployed.address).to.equal(testIsmAddress);
|
|
178
|
+
expect(Object.keys(readIsm.config.domains)).to.have.length(3);
|
|
179
|
+
});
|
|
180
|
+
it('should remove a domain ISM', async () => {
|
|
181
|
+
const [routingIsm] = await routingIsmWriter.create({ config });
|
|
182
|
+
const domain1Ism = routingIsm.config.domains[DOMAIN_1];
|
|
183
|
+
assert(domain1Ism, `Missing ISM for domain ${DOMAIN_1}`);
|
|
184
|
+
const updatedConfig = {
|
|
185
|
+
...routingIsm,
|
|
186
|
+
config: {
|
|
187
|
+
...routingIsm.config,
|
|
188
|
+
domains: {
|
|
189
|
+
[DOMAIN_1]: domain1Ism,
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
const writer = artifactManager.createWriter(AltVM.IsmType.ROUTING, radixSigner);
|
|
194
|
+
const txs = await writer.update(updatedConfig);
|
|
195
|
+
expect(txs).to.be.an('array').with.length.greaterThan(0);
|
|
196
|
+
const removeTx = txs.find((tx) => tx.annotation?.includes('Remove'));
|
|
197
|
+
expect(removeTx).to.exist;
|
|
198
|
+
for (const tx of txs) {
|
|
199
|
+
await providerSdkSigner.sendAndConfirmTransaction(tx);
|
|
200
|
+
}
|
|
201
|
+
const reader = artifactManager.createReader(AltVM.IsmType.ROUTING);
|
|
202
|
+
const readIsm = await reader.read(routingIsm.deployed.address);
|
|
203
|
+
expect(readIsm.config.domains[DOMAIN_2]).to.be.undefined;
|
|
204
|
+
expect(Object.keys(readIsm.config.domains)).to.have.length(1);
|
|
205
|
+
});
|
|
206
|
+
it('should update the ISM address for an existing domain', async () => {
|
|
207
|
+
const [routingIsm] = await routingIsmWriter.create({ config });
|
|
208
|
+
const domain2Ism = routingIsm.config.domains[DOMAIN_2];
|
|
209
|
+
assert(domain2Ism, `Missing ISM for domain ${DOMAIN_2}`);
|
|
210
|
+
const updatedConfig = {
|
|
211
|
+
...routingIsm,
|
|
212
|
+
config: {
|
|
213
|
+
...routingIsm.config,
|
|
214
|
+
domains: {
|
|
215
|
+
[DOMAIN_1]: {
|
|
216
|
+
artifactState: ArtifactState.UNDERIVED,
|
|
217
|
+
deployed: { address: multisigIsmAddress },
|
|
218
|
+
},
|
|
219
|
+
[DOMAIN_2]: domain2Ism,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
const writer = artifactManager.createWriter(AltVM.IsmType.ROUTING, radixSigner);
|
|
224
|
+
const txs = await writer.update(updatedConfig);
|
|
225
|
+
expect(txs).to.be.an('array').with.length.greaterThan(0);
|
|
226
|
+
for (const tx of txs) {
|
|
227
|
+
await providerSdkSigner.sendAndConfirmTransaction(tx);
|
|
228
|
+
}
|
|
229
|
+
const reader = artifactManager.createReader(AltVM.IsmType.ROUTING);
|
|
230
|
+
const readIsm = await reader.read(routingIsm.deployed.address);
|
|
231
|
+
const domain1Ism = readIsm.config.domains[DOMAIN_1];
|
|
232
|
+
assert(domain1Ism, `Missing ISM for domain ${DOMAIN_1}`);
|
|
233
|
+
expect(domain1Ism.deployed.address).to.equal(multisigIsmAddress);
|
|
234
|
+
});
|
|
235
|
+
it('should transfer ownership of the ISM', async () => {
|
|
236
|
+
const [routingIsm] = await routingIsmWriter.create({ config });
|
|
237
|
+
const updatedConfig = {
|
|
238
|
+
...routingIsm,
|
|
239
|
+
config: {
|
|
240
|
+
...routingIsm.config,
|
|
241
|
+
owner: TEST_RADIX_BURN_ADDRESS,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
const writer = artifactManager.createWriter(AltVM.IsmType.ROUTING, radixSigner);
|
|
245
|
+
const txs = await writer.update(updatedConfig);
|
|
246
|
+
expect(txs).to.be.an('array').with.length.greaterThan(0);
|
|
247
|
+
for (const tx of txs) {
|
|
248
|
+
await providerSdkSigner.sendAndConfirmTransaction(tx);
|
|
249
|
+
}
|
|
250
|
+
const reader = artifactManager.createReader(AltVM.IsmType.ROUTING);
|
|
251
|
+
const readIsm = await reader.read(routingIsm.deployed.address);
|
|
252
|
+
expect(readIsm.config.owner).to.equal(TEST_RADIX_BURN_ADDRESS);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=ism.e2e-test.js.map
|