@hyperlane-xyz/sdk 44.0.2 → 45.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/consts/multisigIsm.d.ts.map +1 -1
- package/dist/consts/multisigIsm.js +114 -718
- package/dist/consts/multisigIsm.js.map +1 -1
- package/dist/consts/testChains.d.ts.map +1 -1
- package/dist/consts/testChains.js +11 -6
- package/dist/consts/testChains.js.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.d.ts +6 -0
- package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.js +20 -0
- package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.test.js +17 -0
- package/dist/core/adapters/SealevelCoreAdapter.test.js.map +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/types.test.js +98 -1
- package/dist/core/types.test.js.map +1 -1
- package/dist/deploy/proxy.d.ts +1 -0
- package/dist/deploy/proxy.d.ts.map +1 -1
- package/dist/deploy/proxy.js +6 -0
- package/dist/deploy/proxy.js.map +1 -1
- package/dist/deploy/warp.d.ts.map +1 -1
- package/dist/deploy/warp.js +26 -41
- package/dist/deploy/warp.js.map +1 -1
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts +3 -2
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -1
- package/dist/gas/adapters/SealevelIgpAdapter.js +3 -2
- package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ism/EvmIsmModule.d.ts.map +1 -1
- package/dist/ism/EvmIsmModule.js +5 -1
- package/dist/ism/EvmIsmModule.js.map +1 -1
- package/dist/ism/EvmIsmModule.test.js +109 -0
- package/dist/ism/EvmIsmModule.test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.d.ts +26 -6
- package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +60 -0
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.js +165 -34
- package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.test.js +33 -6
- package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -1
- package/dist/ism/types.d.ts +18 -2
- package/dist/ism/types.d.ts.map +1 -1
- package/dist/ism/types.js +43 -3
- package/dist/ism/types.js.map +1 -1
- package/dist/ism/types.test.js +232 -56
- package/dist/ism/types.test.js.map +1 -1
- package/dist/ism/utils.d.ts.map +1 -1
- package/dist/ism/utils.js +13 -0
- package/dist/ism/utils.js.map +1 -1
- package/dist/ism/utils.test.js +43 -1
- package/dist/ism/utils.test.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.d.ts +1 -0
- package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
- package/dist/metadata/ChainMetadataManager.js +1 -0
- package/dist/metadata/ChainMetadataManager.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.test.js +14 -1
- package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
- package/dist/metadata/ChainMetadataResolver.d.ts +1 -0
- package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -1
- package/dist/metadata/ChainMetadataResolver.js +1 -0
- package/dist/metadata/ChainMetadataResolver.js.map +1 -1
- package/dist/metadata/ChainMetadataResolver.test.js +4 -0
- package/dist/metadata/ChainMetadataResolver.test.js.map +1 -1
- package/dist/metadata/agentConfig.d.ts +209 -93
- package/dist/metadata/agentConfig.d.ts.map +1 -1
- package/dist/metadata/agentConfig.js +106 -13
- package/dist/metadata/agentConfig.js.map +1 -1
- package/dist/metadata/agentConfig.test.js +277 -25
- package/dist/metadata/agentConfig.test.js.map +1 -1
- package/dist/metadata/chainMetadata.test.js +25 -0
- package/dist/metadata/chainMetadata.test.js.map +1 -1
- package/dist/metadata/chainMetadataTypes.d.ts +36 -0
- package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
- package/dist/metadata/chainMetadataTypes.js +26 -0
- package/dist/metadata/chainMetadataTypes.js.map +1 -1
- package/dist/providers/SeismicSigner.d.ts +4 -12
- package/dist/providers/SeismicSigner.d.ts.map +1 -1
- package/dist/providers/SeismicSigner.js +84 -35
- package/dist/providers/SeismicSigner.js.map +1 -1
- package/dist/providers/SeismicSigner.test.d.ts +2 -0
- package/dist/providers/SeismicSigner.test.d.ts.map +1 -0
- package/dist/providers/SeismicSigner.test.js +160 -0
- package/dist/providers/SeismicSigner.test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.d.ts +0 -4
- package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts +2 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js +164 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.js +20 -61
- package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.test.js +159 -0
- package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
- package/dist/providers/SmartProvider/jsonRpcError.d.ts +7 -0
- package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
- package/dist/providers/SmartProvider/jsonRpcError.js +67 -0
- package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
- package/dist/providers/SmartProvider/types.d.ts +1 -0
- package/dist/providers/SmartProvider/types.d.ts.map +1 -1
- package/dist/providers/builders/ethersV5.d.ts +0 -1
- package/dist/providers/builders/ethersV5.d.ts.map +1 -1
- package/dist/providers/builders/ethersV5.js +19 -5
- package/dist/providers/builders/ethersV5.js.map +1 -1
- package/dist/providers/builders/ethersV5.test.d.ts +2 -0
- package/dist/providers/builders/ethersV5.test.d.ts.map +1 -0
- package/dist/providers/builders/ethersV5.test.js +77 -0
- package/dist/providers/builders/ethersV5.test.js.map +1 -0
- package/dist/providers/builders/radix.browser.d.ts +1 -0
- package/dist/providers/builders/radix.browser.d.ts.map +1 -1
- package/dist/providers/builders/radix.browser.js +1 -0
- package/dist/providers/builders/radix.browser.js.map +1 -1
- package/dist/providers/builders/radix.d.ts.map +1 -1
- package/dist/providers/builders/radix.gateway.test.d.ts +2 -0
- package/dist/providers/builders/radix.gateway.test.d.ts.map +1 -0
- package/dist/providers/builders/radix.gateway.test.js +39 -0
- package/dist/providers/builders/radix.gateway.test.js.map +1 -0
- package/dist/providers/builders/radix.js +1 -0
- package/dist/providers/builders/radix.js.map +1 -1
- package/dist/providers/builders/radix.test.js +1 -0
- package/dist/providers/builders/radix.test.js.map +1 -1
- package/dist/providers/providerBuilders.d.ts +1 -1
- package/dist/providers/providerBuilders.d.ts.map +1 -1
- package/dist/providers/providerBuilders.js +1 -1
- package/dist/providers/providerBuilders.js.map +1 -1
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +60 -8
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
- package/dist/test/errors.d.ts +21 -0
- package/dist/test/errors.d.ts.map +1 -1
- package/dist/test/errors.js +25 -0
- package/dist/test/errors.js.map +1 -1
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +92 -7
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -1
- package/dist/timelock/evm/errors.js +1 -1
- package/dist/timelock/evm/errors.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.d.ts +26 -0
- package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
- package/dist/token/EvmWarpRouteReader.hardhat-test.js +28 -3
- package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.js +137 -41
- package/dist/token/EvmWarpRouteReader.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.test.js +381 -3
- package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
- package/dist/token/types.d.ts +1 -1
- package/dist/token/warpCheck.d.ts +1 -0
- package/dist/token/warpCheck.d.ts.map +1 -1
- package/dist/token/warpCheck.js +25 -2
- package/dist/token/warpCheck.js.map +1 -1
- package/dist/token/warpCheck.test.js +119 -0
- package/dist/token/warpCheck.test.js.map +1 -1
- package/dist/utils/contract.d.ts +32 -0
- package/dist/utils/contract.d.ts.map +1 -1
- package/dist/utils/contract.js +90 -3
- package/dist/utils/contract.js.map +1 -1
- package/dist/utils/contract.test.js +402 -2
- package/dist/utils/contract.test.js.map +1 -1
- package/dist/utils/contract.transport.test.d.ts +2 -0
- package/dist/utils/contract.transport.test.d.ts.map +1 -0
- package/dist/utils/contract.transport.test.js +145 -0
- package/dist/utils/contract.transport.test.js.map +1 -0
- package/dist/utils/ism.d.ts +12 -6
- package/dist/utils/ism.d.ts.map +1 -1
- package/dist/utils/ism.js +92 -41
- package/dist/utils/ism.js.map +1 -1
- package/dist/utils/ism.test.js +75 -2
- package/dist/utils/ism.test.js.map +1 -1
- package/package.json +29 -15
package/dist/ism/types.test.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { expect } from 'chai';
|
|
2
2
|
import { ethers } from 'ethers';
|
|
3
|
-
import { assert } from '@hyperlane-xyz/utils';
|
|
3
|
+
import { ZERO_ADDRESS_HEX_32, assert } from '@hyperlane-xyz/utils';
|
|
4
4
|
import { RATE_LIMIT_DEFAULT_DURATION_SECONDS } from '../types.js';
|
|
5
|
-
import { AggregationIsmConfigSchema, BlacklistIsmConfigSchema, CompositeIsmConfigSchema, DelayedFlowRouterHookIsmConfigSchema, IsmConfigSchema, IsmType, MAX_SAFE_UINT48, ModuleType, RateLimitedIsmConfigSchema, NetFlowRateLimitedHookIsmConfigSchema, ismTypeToModuleType, } from './types.js';
|
|
5
|
+
import { AggregationIsmConfigSchema, BlacklistIsmConfigSchema, CompositeIsmConfigSchema, CompositeIsmNodeType, DelayedFlowRouterHookIsmConfigSchema, IsmConfigSchema, IsmType, MAX_SAFE_UINT48, ModuleType, RateLimitedIsmConfigSchema, RoutingMessageIdMultisigIsmConfigSchema, NetFlowRateLimitedHookIsmConfigSchema, ismTypeToModuleType, } from './types.js';
|
|
6
6
|
const SOME_ADDRESS = ethers.Wallet.createRandom().address;
|
|
7
7
|
const OTHER_ADDRESS = ethers.Wallet.createRandom().address;
|
|
8
8
|
// Composite ISM (Sealevel-only) wire fields have distinct formats from the
|
|
@@ -481,27 +481,147 @@ describe('ModuleType', () => {
|
|
|
481
481
|
expect(ismTypeToModuleType(IsmType.COMPOSITE)).to.equal(ModuleType.COMPOSITE);
|
|
482
482
|
});
|
|
483
483
|
});
|
|
484
|
+
describe('RoutingMessageIdMultisigIsmConfigSchema', () => {
|
|
485
|
+
const VALIDATOR_A = '0x' + 'a'.repeat(40);
|
|
486
|
+
const VALIDATOR_B = '0x' + 'b'.repeat(40);
|
|
487
|
+
const base = {
|
|
488
|
+
type: IsmType.ROUTING_MESSAGE_ID_MULTISIG,
|
|
489
|
+
owner: SEALEVEL_ADDRESS,
|
|
490
|
+
domains: {
|
|
491
|
+
ethereum: { validators: [VALIDATOR_A, VALIDATOR_B], threshold: 2 },
|
|
492
|
+
test2: { validators: [VALIDATOR_A], threshold: 1 },
|
|
493
|
+
},
|
|
494
|
+
};
|
|
495
|
+
it('maps to ModuleType.MESSAGE_ID_MULTISIG', () => {
|
|
496
|
+
expect(ismTypeToModuleType(IsmType.ROUTING_MESSAGE_ID_MULTISIG)).to.equal(ModuleType.MESSAGE_ID_MULTISIG);
|
|
497
|
+
});
|
|
498
|
+
const THRESHOLD_ISSUE = {
|
|
499
|
+
path: ['domains', 'ethereum', 'threshold'],
|
|
500
|
+
message: 'Threshold must be between 1 and the number of validators (inclusive)',
|
|
501
|
+
};
|
|
502
|
+
const validatorsIssueCases = [
|
|
503
|
+
{
|
|
504
|
+
name: 'threshold 0',
|
|
505
|
+
validators: [VALIDATOR_A],
|
|
506
|
+
threshold: 0,
|
|
507
|
+
issues: [THRESHOLD_ISSUE],
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
name: 'a threshold greater than the validator count',
|
|
511
|
+
validators: [VALIDATOR_A],
|
|
512
|
+
threshold: 2,
|
|
513
|
+
issues: [THRESHOLD_ISSUE],
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
name: 'duplicate validators differing by case',
|
|
517
|
+
validators: ['0x' + 'ab'.repeat(20), '0x' + 'AB'.repeat(20)],
|
|
518
|
+
issues: [
|
|
519
|
+
{
|
|
520
|
+
path: ['domains', 'ethereum', 'validators'],
|
|
521
|
+
message: `Duplicate validator address: 0x${'AB'.repeat(20)}`,
|
|
522
|
+
},
|
|
523
|
+
],
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
name: 'an empty validator set',
|
|
527
|
+
validators: [],
|
|
528
|
+
issues: [
|
|
529
|
+
{
|
|
530
|
+
path: ['domains', 'ethereum', 'validators'],
|
|
531
|
+
message: 'At least one validator is required',
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
path: ['domains', 'ethereum', 'threshold'],
|
|
535
|
+
message: 'Threshold must be between 1 and the number of validators (inclusive)',
|
|
536
|
+
},
|
|
537
|
+
],
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
name: 'a non-array validator set',
|
|
541
|
+
validators: VALIDATOR_A,
|
|
542
|
+
issues: [
|
|
543
|
+
{
|
|
544
|
+
path: ['domains', 'ethereum', 'validators'],
|
|
545
|
+
message: 'Invalid input: expected array, received string',
|
|
546
|
+
},
|
|
547
|
+
],
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
name: 'a bad validator address',
|
|
551
|
+
validators: ['0x1234'],
|
|
552
|
+
issues: [
|
|
553
|
+
{
|
|
554
|
+
path: ['domains', 'ethereum', 'validators', 0],
|
|
555
|
+
message: 'must be a 20-byte (0x + 40 hex chars) address',
|
|
556
|
+
},
|
|
557
|
+
],
|
|
558
|
+
},
|
|
559
|
+
];
|
|
560
|
+
for (const c of validatorsIssueCases) {
|
|
561
|
+
it(`reports the exact issue for ${c.name}`, () => {
|
|
562
|
+
const result = RoutingMessageIdMultisigIsmConfigSchema.safeParse({
|
|
563
|
+
...base,
|
|
564
|
+
domains: {
|
|
565
|
+
ethereum: {
|
|
566
|
+
validators: c.validators,
|
|
567
|
+
threshold: c.threshold ?? 1,
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
});
|
|
571
|
+
assert(!result.success, 'expected the config to be rejected');
|
|
572
|
+
expect(result.error.issues.map((i) => ({ path: i.path, message: i.message }))).to.deep.equal(c.issues);
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
it('parses via the schema and the top-level IsmConfigSchema union', () => {
|
|
576
|
+
const direct = RoutingMessageIdMultisigIsmConfigSchema.safeParse(base);
|
|
577
|
+
expect(direct.success).to.be.true;
|
|
578
|
+
if (direct.success) {
|
|
579
|
+
expect(direct.data.domains.ethereum.threshold).to.equal(2);
|
|
580
|
+
}
|
|
581
|
+
expect(IsmConfigSchema.safeParse(base).success).to.be.true;
|
|
582
|
+
});
|
|
583
|
+
const ownerCases = [
|
|
584
|
+
{ name: 'a base58 Sealevel owner', owner: SEALEVEL_ADDRESS },
|
|
585
|
+
{
|
|
586
|
+
name: 'the reader renounced-owner sentinel',
|
|
587
|
+
owner: ZERO_ADDRESS_HEX_32,
|
|
588
|
+
},
|
|
589
|
+
];
|
|
590
|
+
for (const c of ownerCases) {
|
|
591
|
+
it(`parses ${c.name}`, () => {
|
|
592
|
+
const result = RoutingMessageIdMultisigIsmConfigSchema.safeParse({
|
|
593
|
+
...base,
|
|
594
|
+
owner: c.owner,
|
|
595
|
+
});
|
|
596
|
+
assert(result.success, 'expected the config to parse');
|
|
597
|
+
expect(result.data.owner).to.equal(c.owner);
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
});
|
|
484
601
|
describe('CompositeIsmConfigSchema', () => {
|
|
485
602
|
const sample = {
|
|
486
603
|
type: IsmType.COMPOSITE,
|
|
487
604
|
owner: SEALEVEL_ADDRESS,
|
|
488
605
|
root: {
|
|
489
|
-
type:
|
|
606
|
+
type: CompositeIsmNodeType.AGGREGATION,
|
|
490
607
|
threshold: 2,
|
|
491
608
|
subIsms: [
|
|
492
|
-
{ type: 'trustedRelayer', relayer: SEALEVEL_ADDRESS },
|
|
493
609
|
{
|
|
494
|
-
type:
|
|
610
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
611
|
+
relayer: SEALEVEL_ADDRESS,
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
type: CompositeIsmNodeType.ROUTING,
|
|
495
615
|
domains: {
|
|
496
|
-
solanamainnet: { type:
|
|
616
|
+
solanamainnet: { type: CompositeIsmNodeType.TEST, accept: true },
|
|
497
617
|
},
|
|
498
618
|
},
|
|
499
619
|
{
|
|
500
|
-
type:
|
|
620
|
+
type: CompositeIsmNodeType.AMOUNT_ROUTING,
|
|
501
621
|
threshold: '1000000',
|
|
502
|
-
lower: { type:
|
|
622
|
+
lower: { type: CompositeIsmNodeType.PAUSABLE, paused: false },
|
|
503
623
|
upper: {
|
|
504
|
-
type:
|
|
624
|
+
type: CompositeIsmNodeType.RATE_LIMITED,
|
|
505
625
|
maxCapacity: '86400',
|
|
506
626
|
mailbox: SEALEVEL_ADDRESS,
|
|
507
627
|
recipient: H256_ADDRESS,
|
|
@@ -521,7 +641,7 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
521
641
|
typeof result.data === 'object' &&
|
|
522
642
|
result.data !== null &&
|
|
523
643
|
'type' in result.data) {
|
|
524
|
-
expect(result.data.type).to.equal(
|
|
644
|
+
expect(result.data.type).to.equal(IsmType.COMPOSITE);
|
|
525
645
|
}
|
|
526
646
|
});
|
|
527
647
|
it('rejects an unknown node type', () => {
|
|
@@ -535,18 +655,28 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
535
655
|
const tooHigh = {
|
|
536
656
|
...sample,
|
|
537
657
|
root: {
|
|
538
|
-
type:
|
|
658
|
+
type: CompositeIsmNodeType.AGGREGATION,
|
|
539
659
|
threshold: 5,
|
|
540
|
-
subIsms: [
|
|
660
|
+
subIsms: [
|
|
661
|
+
{
|
|
662
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
663
|
+
relayer: SEALEVEL_ADDRESS,
|
|
664
|
+
},
|
|
665
|
+
],
|
|
541
666
|
},
|
|
542
667
|
};
|
|
543
668
|
expect(CompositeIsmConfigSchema.safeParse(tooHigh).success).to.be.false;
|
|
544
669
|
const tooLow = {
|
|
545
670
|
...sample,
|
|
546
671
|
root: {
|
|
547
|
-
type:
|
|
672
|
+
type: CompositeIsmNodeType.AGGREGATION,
|
|
548
673
|
threshold: 0,
|
|
549
|
-
subIsms: [
|
|
674
|
+
subIsms: [
|
|
675
|
+
{
|
|
676
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
677
|
+
relayer: SEALEVEL_ADDRESS,
|
|
678
|
+
},
|
|
679
|
+
],
|
|
550
680
|
},
|
|
551
681
|
};
|
|
552
682
|
expect(CompositeIsmConfigSchema.safeParse(tooLow).success).to.be.false;
|
|
@@ -555,7 +685,7 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
555
685
|
const invalid = {
|
|
556
686
|
...sample,
|
|
557
687
|
root: {
|
|
558
|
-
type:
|
|
688
|
+
type: CompositeIsmNodeType.MULTISIG_MESSAGE_ID,
|
|
559
689
|
threshold: 1,
|
|
560
690
|
validators: [SOME_ADDRESS, '0x' + SOME_ADDRESS.slice(2).toUpperCase()],
|
|
561
691
|
},
|
|
@@ -566,7 +696,7 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
566
696
|
const invalid = {
|
|
567
697
|
...sample,
|
|
568
698
|
root: {
|
|
569
|
-
type:
|
|
699
|
+
type: CompositeIsmNodeType.MULTISIG_MESSAGE_ID,
|
|
570
700
|
threshold: 3,
|
|
571
701
|
validators: [SOME_ADDRESS, OTHER_ADDRESS],
|
|
572
702
|
},
|
|
@@ -577,7 +707,7 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
577
707
|
const invalid = {
|
|
578
708
|
...sample,
|
|
579
709
|
root: {
|
|
580
|
-
type:
|
|
710
|
+
type: CompositeIsmNodeType.MULTISIG_MESSAGE_ID,
|
|
581
711
|
threshold: 1.5,
|
|
582
712
|
validators: [SOME_ADDRESS, OTHER_ADDRESS],
|
|
583
713
|
},
|
|
@@ -588,51 +718,70 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
588
718
|
const invalid = {
|
|
589
719
|
...sample,
|
|
590
720
|
root: {
|
|
591
|
-
type:
|
|
721
|
+
type: CompositeIsmNodeType.MULTISIG_MESSAGE_ID,
|
|
592
722
|
threshold: 1,
|
|
593
723
|
validators: [SEALEVEL_ADDRESS],
|
|
594
724
|
},
|
|
595
725
|
};
|
|
596
726
|
expect(CompositeIsmConfigSchema.safeParse(invalid).success).to.be.false;
|
|
597
727
|
});
|
|
598
|
-
it('rejects a rateLimited node with a zero mailbox or
|
|
728
|
+
it('rejects a rateLimited node with a zero mailbox or zero recipient', () => {
|
|
599
729
|
const zeroMailbox = {
|
|
600
730
|
...sample,
|
|
601
731
|
root: {
|
|
602
|
-
type:
|
|
732
|
+
type: CompositeIsmNodeType.RATE_LIMITED,
|
|
603
733
|
maxCapacity: '86400',
|
|
604
734
|
mailbox: SEALEVEL_ZERO_ADDRESS,
|
|
605
735
|
recipient: H256_ADDRESS,
|
|
606
736
|
},
|
|
607
737
|
};
|
|
608
738
|
expect(CompositeIsmConfigSchema.safeParse(zeroMailbox).success).to.be.false;
|
|
609
|
-
const
|
|
739
|
+
const zeroRecipient = {
|
|
610
740
|
...sample,
|
|
611
741
|
root: {
|
|
612
|
-
type:
|
|
742
|
+
type: CompositeIsmNodeType.RATE_LIMITED,
|
|
613
743
|
maxCapacity: '86400',
|
|
614
744
|
mailbox: SEALEVEL_ADDRESS,
|
|
745
|
+
recipient: H256_ZERO,
|
|
615
746
|
},
|
|
616
747
|
};
|
|
617
|
-
expect(CompositeIsmConfigSchema.safeParse(
|
|
748
|
+
expect(CompositeIsmConfigSchema.safeParse(zeroRecipient).success).to.be
|
|
618
749
|
.false;
|
|
619
|
-
|
|
750
|
+
});
|
|
751
|
+
it('accepts a rateLimited node with an omitted recipient', () => {
|
|
752
|
+
const omittedRecipient = {
|
|
620
753
|
...sample,
|
|
621
754
|
root: {
|
|
622
|
-
type:
|
|
755
|
+
type: CompositeIsmNodeType.RATE_LIMITED,
|
|
623
756
|
maxCapacity: '86400',
|
|
624
757
|
mailbox: SEALEVEL_ADDRESS,
|
|
625
|
-
recipient: H256_ZERO,
|
|
626
758
|
},
|
|
627
759
|
};
|
|
628
|
-
expect(CompositeIsmConfigSchema.safeParse(
|
|
629
|
-
.
|
|
760
|
+
expect(CompositeIsmConfigSchema.safeParse(omittedRecipient).success).to.be
|
|
761
|
+
.true;
|
|
762
|
+
});
|
|
763
|
+
it('accepts a rateLimited node nested under a routing domain with an omitted recipient', () => {
|
|
764
|
+
const omittedRecipient = {
|
|
765
|
+
...sample,
|
|
766
|
+
root: {
|
|
767
|
+
type: CompositeIsmNodeType.ROUTING,
|
|
768
|
+
domains: {
|
|
769
|
+
ethereum: {
|
|
770
|
+
type: CompositeIsmNodeType.RATE_LIMITED,
|
|
771
|
+
maxCapacity: '86400',
|
|
772
|
+
mailbox: SEALEVEL_ADDRESS,
|
|
773
|
+
},
|
|
774
|
+
},
|
|
775
|
+
},
|
|
776
|
+
};
|
|
777
|
+
expect(CompositeIsmConfigSchema.safeParse(omittedRecipient).success).to.be
|
|
778
|
+
.true;
|
|
630
779
|
});
|
|
631
780
|
it('rejects a rateLimited node with maxCapacity above u64::MAX', () => {
|
|
632
781
|
const invalid = {
|
|
633
782
|
...sample,
|
|
634
783
|
root: {
|
|
635
|
-
type:
|
|
784
|
+
type: CompositeIsmNodeType.RATE_LIMITED,
|
|
636
785
|
maxCapacity: (2n ** 64n).toString(),
|
|
637
786
|
mailbox: SEALEVEL_ADDRESS,
|
|
638
787
|
recipient: H256_ADDRESS,
|
|
@@ -644,10 +793,10 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
644
793
|
const invalid = {
|
|
645
794
|
...sample,
|
|
646
795
|
root: {
|
|
647
|
-
type:
|
|
796
|
+
type: CompositeIsmNodeType.AMOUNT_ROUTING,
|
|
648
797
|
threshold: (2n ** 256n).toString(),
|
|
649
|
-
lower: { type:
|
|
650
|
-
upper: { type:
|
|
798
|
+
lower: { type: CompositeIsmNodeType.TEST, accept: true },
|
|
799
|
+
upper: { type: CompositeIsmNodeType.TEST, accept: false },
|
|
651
800
|
},
|
|
652
801
|
};
|
|
653
802
|
expect(CompositeIsmConfigSchema.safeParse(invalid).success).to.be.false;
|
|
@@ -657,7 +806,7 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
657
806
|
const invalid = {
|
|
658
807
|
...sample,
|
|
659
808
|
root: {
|
|
660
|
-
type:
|
|
809
|
+
type: CompositeIsmNodeType.RATE_LIMITED,
|
|
661
810
|
maxCapacity: badValue,
|
|
662
811
|
mailbox: SEALEVEL_ADDRESS,
|
|
663
812
|
recipient: H256_ADDRESS,
|
|
@@ -675,7 +824,7 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
675
824
|
const invalidMultisig = {
|
|
676
825
|
...sample,
|
|
677
826
|
root: {
|
|
678
|
-
type:
|
|
827
|
+
type: CompositeIsmNodeType.MULTISIG_MESSAGE_ID,
|
|
679
828
|
threshold: 256,
|
|
680
829
|
validators,
|
|
681
830
|
},
|
|
@@ -685,9 +834,14 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
685
834
|
const invalidAggregation = {
|
|
686
835
|
...sample,
|
|
687
836
|
root: {
|
|
688
|
-
type:
|
|
837
|
+
type: CompositeIsmNodeType.AGGREGATION,
|
|
689
838
|
threshold: 256,
|
|
690
|
-
subIsms: [
|
|
839
|
+
subIsms: [
|
|
840
|
+
{
|
|
841
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
842
|
+
relayer: SEALEVEL_ADDRESS,
|
|
843
|
+
},
|
|
844
|
+
],
|
|
691
845
|
},
|
|
692
846
|
};
|
|
693
847
|
expect(CompositeIsmConfigSchema.safeParse(invalidAggregation).success).to.be
|
|
@@ -696,14 +850,20 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
696
850
|
it('rejects a trustedRelayer node with a zero relayer', () => {
|
|
697
851
|
const invalid = {
|
|
698
852
|
...sample,
|
|
699
|
-
root: {
|
|
853
|
+
root: {
|
|
854
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
855
|
+
relayer: SEALEVEL_ZERO_ADDRESS,
|
|
856
|
+
},
|
|
700
857
|
};
|
|
701
858
|
expect(CompositeIsmConfigSchema.safeParse(invalid).success).to.be.false;
|
|
702
859
|
});
|
|
703
860
|
it('rejects a trustedRelayer node with an EVM-style hex relayer', () => {
|
|
704
861
|
const invalid = {
|
|
705
862
|
...sample,
|
|
706
|
-
root: {
|
|
863
|
+
root: {
|
|
864
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
865
|
+
relayer: SOME_ADDRESS,
|
|
866
|
+
},
|
|
707
867
|
};
|
|
708
868
|
expect(CompositeIsmConfigSchema.safeParse(invalid).success).to.be.false;
|
|
709
869
|
});
|
|
@@ -712,13 +872,19 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
712
872
|
// range, but neither actually decodes to a 32-byte public key.
|
|
713
873
|
const wrongAlphabetDensity = {
|
|
714
874
|
...sample,
|
|
715
|
-
root: {
|
|
875
|
+
root: {
|
|
876
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
877
|
+
relayer: 'z'.repeat(32),
|
|
878
|
+
},
|
|
716
879
|
};
|
|
717
880
|
expect(CompositeIsmConfigSchema.safeParse(wrongAlphabetDensity).success).to
|
|
718
881
|
.be.false;
|
|
719
882
|
const wrongWidth = {
|
|
720
883
|
...sample,
|
|
721
|
-
root: {
|
|
884
|
+
root: {
|
|
885
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
886
|
+
relayer: '1'.repeat(33),
|
|
887
|
+
},
|
|
722
888
|
};
|
|
723
889
|
expect(CompositeIsmConfigSchema.safeParse(wrongWidth).success).to.be.false;
|
|
724
890
|
});
|
|
@@ -726,12 +892,12 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
726
892
|
const invalid = {
|
|
727
893
|
...sample,
|
|
728
894
|
root: {
|
|
729
|
-
type:
|
|
895
|
+
type: CompositeIsmNodeType.AGGREGATION,
|
|
730
896
|
threshold: 1,
|
|
731
897
|
subIsms: [
|
|
732
|
-
{ type:
|
|
898
|
+
{ type: CompositeIsmNodeType.ROUTING, domains: {} },
|
|
733
899
|
{
|
|
734
|
-
type:
|
|
900
|
+
type: CompositeIsmNodeType.FALLBACK_ROUTING,
|
|
735
901
|
fallbackIsm: SEALEVEL_ADDRESS,
|
|
736
902
|
domains: {},
|
|
737
903
|
},
|
|
@@ -744,7 +910,7 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
744
910
|
const invalid = {
|
|
745
911
|
...sample,
|
|
746
912
|
root: {
|
|
747
|
-
type:
|
|
913
|
+
type: CompositeIsmNodeType.FALLBACK_ROUTING,
|
|
748
914
|
fallbackIsm: SEALEVEL_ZERO_ADDRESS,
|
|
749
915
|
domains: {},
|
|
750
916
|
},
|
|
@@ -755,15 +921,18 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
755
921
|
const invalid = {
|
|
756
922
|
...sample,
|
|
757
923
|
root: {
|
|
758
|
-
type:
|
|
924
|
+
type: CompositeIsmNodeType.AGGREGATION,
|
|
759
925
|
threshold: 2,
|
|
760
926
|
subIsms: [
|
|
761
927
|
{
|
|
762
|
-
type:
|
|
928
|
+
type: CompositeIsmNodeType.FALLBACK_ROUTING,
|
|
763
929
|
fallbackIsm: SEALEVEL_ADDRESS,
|
|
764
930
|
domains: {},
|
|
765
931
|
},
|
|
766
|
-
{
|
|
932
|
+
{
|
|
933
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
934
|
+
relayer: SEALEVEL_ADDRESS,
|
|
935
|
+
},
|
|
767
936
|
],
|
|
768
937
|
},
|
|
769
938
|
};
|
|
@@ -773,8 +942,10 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
773
942
|
const nestedRouting = {
|
|
774
943
|
...sample,
|
|
775
944
|
root: {
|
|
776
|
-
type:
|
|
777
|
-
domains: {
|
|
945
|
+
type: CompositeIsmNodeType.ROUTING,
|
|
946
|
+
domains: {
|
|
947
|
+
ethereum: { type: CompositeIsmNodeType.ROUTING, domains: {} },
|
|
948
|
+
},
|
|
778
949
|
},
|
|
779
950
|
};
|
|
780
951
|
expect(CompositeIsmConfigSchema.safeParse(nestedRouting).success).to.be
|
|
@@ -782,10 +953,10 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
782
953
|
const nestedFallbackRouting = {
|
|
783
954
|
...sample,
|
|
784
955
|
root: {
|
|
785
|
-
type:
|
|
956
|
+
type: CompositeIsmNodeType.ROUTING,
|
|
786
957
|
domains: {
|
|
787
958
|
ethereum: {
|
|
788
|
-
type:
|
|
959
|
+
type: CompositeIsmNodeType.FALLBACK_ROUTING,
|
|
789
960
|
fallbackIsm: SEALEVEL_ADDRESS,
|
|
790
961
|
domains: {},
|
|
791
962
|
},
|
|
@@ -797,8 +968,10 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
797
968
|
const nestedPausable = {
|
|
798
969
|
...sample,
|
|
799
970
|
root: {
|
|
800
|
-
type:
|
|
801
|
-
domains: {
|
|
971
|
+
type: CompositeIsmNodeType.ROUTING,
|
|
972
|
+
domains: {
|
|
973
|
+
ethereum: { type: CompositeIsmNodeType.PAUSABLE, paused: false },
|
|
974
|
+
},
|
|
802
975
|
},
|
|
803
976
|
};
|
|
804
977
|
expect(CompositeIsmConfigSchema.safeParse(nestedPausable).success).to.be
|
|
@@ -808,10 +981,10 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
808
981
|
const valid = {
|
|
809
982
|
...sample,
|
|
810
983
|
root: {
|
|
811
|
-
type:
|
|
984
|
+
type: CompositeIsmNodeType.ROUTING,
|
|
812
985
|
domains: {
|
|
813
986
|
ethereum: {
|
|
814
|
-
type:
|
|
987
|
+
type: CompositeIsmNodeType.MULTISIG_MESSAGE_ID,
|
|
815
988
|
validators: [SOME_ADDRESS, OTHER_ADDRESS],
|
|
816
989
|
threshold: 1,
|
|
817
990
|
},
|
|
@@ -823,7 +996,10 @@ describe('CompositeIsmConfigSchema', () => {
|
|
|
823
996
|
it('accepts a second, distinct base58 pubkey for trustedRelayer', () => {
|
|
824
997
|
const valid = {
|
|
825
998
|
...sample,
|
|
826
|
-
root: {
|
|
999
|
+
root: {
|
|
1000
|
+
type: CompositeIsmNodeType.TRUSTED_RELAYER,
|
|
1001
|
+
relayer: OTHER_SEALEVEL_ADDRESS,
|
|
1002
|
+
},
|
|
827
1003
|
};
|
|
828
1004
|
expect(CompositeIsmConfigSchema.safeParse(valid).success).to.be.true;
|
|
829
1005
|
});
|