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