@hyperlane-xyz/sdk 44.0.1 → 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.
Files changed (171) hide show
  1. package/dist/consts/multisigIsm.d.ts.map +1 -1
  2. package/dist/consts/multisigIsm.js +114 -718
  3. package/dist/consts/multisigIsm.js.map +1 -1
  4. package/dist/consts/testChains.d.ts.map +1 -1
  5. package/dist/consts/testChains.js +11 -6
  6. package/dist/consts/testChains.js.map +1 -1
  7. package/dist/core/adapters/SealevelCoreAdapter.d.ts +6 -0
  8. package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -1
  9. package/dist/core/adapters/SealevelCoreAdapter.js +20 -0
  10. package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -1
  11. package/dist/core/adapters/SealevelCoreAdapter.test.js +17 -0
  12. package/dist/core/adapters/SealevelCoreAdapter.test.js.map +1 -1
  13. package/dist/core/types.d.ts.map +1 -1
  14. package/dist/core/types.js +14 -1
  15. package/dist/core/types.js.map +1 -1
  16. package/dist/core/types.test.js +98 -1
  17. package/dist/core/types.test.js.map +1 -1
  18. package/dist/deploy/proxy.d.ts +1 -0
  19. package/dist/deploy/proxy.d.ts.map +1 -1
  20. package/dist/deploy/proxy.js +6 -0
  21. package/dist/deploy/proxy.js.map +1 -1
  22. package/dist/deploy/warp.d.ts.map +1 -1
  23. package/dist/deploy/warp.js +26 -41
  24. package/dist/deploy/warp.js.map +1 -1
  25. package/dist/gas/adapters/SealevelIgpAdapter.d.ts +3 -2
  26. package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -1
  27. package/dist/gas/adapters/SealevelIgpAdapter.js +3 -2
  28. package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -1
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +2 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/ism/EvmIsmModule.d.ts.map +1 -1
  34. package/dist/ism/EvmIsmModule.js +5 -1
  35. package/dist/ism/EvmIsmModule.js.map +1 -1
  36. package/dist/ism/EvmIsmModule.test.js +109 -0
  37. package/dist/ism/EvmIsmModule.test.js.map +1 -1
  38. package/dist/ism/HyperlaneIsmFactory.d.ts +26 -6
  39. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
  40. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +60 -0
  41. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
  42. package/dist/ism/HyperlaneIsmFactory.js +165 -34
  43. package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
  44. package/dist/ism/HyperlaneIsmFactory.test.js +33 -6
  45. package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -1
  46. package/dist/ism/types.d.ts +18 -2
  47. package/dist/ism/types.d.ts.map +1 -1
  48. package/dist/ism/types.js +43 -3
  49. package/dist/ism/types.js.map +1 -1
  50. package/dist/ism/types.test.js +232 -56
  51. package/dist/ism/types.test.js.map +1 -1
  52. package/dist/ism/utils.d.ts.map +1 -1
  53. package/dist/ism/utils.js +13 -0
  54. package/dist/ism/utils.js.map +1 -1
  55. package/dist/ism/utils.test.js +43 -1
  56. package/dist/ism/utils.test.js.map +1 -1
  57. package/dist/metadata/ChainMetadataManager.d.ts +1 -0
  58. package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
  59. package/dist/metadata/ChainMetadataManager.js +1 -0
  60. package/dist/metadata/ChainMetadataManager.js.map +1 -1
  61. package/dist/metadata/ChainMetadataManager.test.js +14 -1
  62. package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
  63. package/dist/metadata/ChainMetadataResolver.d.ts +1 -0
  64. package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -1
  65. package/dist/metadata/ChainMetadataResolver.js +1 -0
  66. package/dist/metadata/ChainMetadataResolver.js.map +1 -1
  67. package/dist/metadata/ChainMetadataResolver.test.js +4 -0
  68. package/dist/metadata/ChainMetadataResolver.test.js.map +1 -1
  69. package/dist/metadata/agentConfig.d.ts +209 -93
  70. package/dist/metadata/agentConfig.d.ts.map +1 -1
  71. package/dist/metadata/agentConfig.js +106 -13
  72. package/dist/metadata/agentConfig.js.map +1 -1
  73. package/dist/metadata/agentConfig.test.js +277 -25
  74. package/dist/metadata/agentConfig.test.js.map +1 -1
  75. package/dist/metadata/chainMetadata.test.js +25 -0
  76. package/dist/metadata/chainMetadata.test.js.map +1 -1
  77. package/dist/metadata/chainMetadataTypes.d.ts +36 -0
  78. package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
  79. package/dist/metadata/chainMetadataTypes.js +26 -0
  80. package/dist/metadata/chainMetadataTypes.js.map +1 -1
  81. package/dist/providers/SeismicSigner.d.ts +4 -12
  82. package/dist/providers/SeismicSigner.d.ts.map +1 -1
  83. package/dist/providers/SeismicSigner.js +84 -35
  84. package/dist/providers/SeismicSigner.js.map +1 -1
  85. package/dist/providers/SeismicSigner.test.d.ts +2 -0
  86. package/dist/providers/SeismicSigner.test.d.ts.map +1 -0
  87. package/dist/providers/SeismicSigner.test.js +160 -0
  88. package/dist/providers/SeismicSigner.test.js.map +1 -0
  89. package/dist/providers/SmartProvider/SmartProvider.d.ts +0 -4
  90. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
  91. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts +2 -0
  92. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts.map +1 -0
  93. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js +164 -0
  94. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js.map +1 -0
  95. package/dist/providers/SmartProvider/SmartProvider.js +20 -61
  96. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
  97. package/dist/providers/SmartProvider/SmartProvider.test.js +159 -0
  98. package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
  99. package/dist/providers/SmartProvider/jsonRpcError.d.ts +7 -0
  100. package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
  101. package/dist/providers/SmartProvider/jsonRpcError.js +67 -0
  102. package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
  103. package/dist/providers/SmartProvider/types.d.ts +1 -0
  104. package/dist/providers/SmartProvider/types.d.ts.map +1 -1
  105. package/dist/providers/builders/ethersV5.d.ts +0 -1
  106. package/dist/providers/builders/ethersV5.d.ts.map +1 -1
  107. package/dist/providers/builders/ethersV5.js +19 -5
  108. package/dist/providers/builders/ethersV5.js.map +1 -1
  109. package/dist/providers/builders/ethersV5.test.d.ts +2 -0
  110. package/dist/providers/builders/ethersV5.test.d.ts.map +1 -0
  111. package/dist/providers/builders/ethersV5.test.js +77 -0
  112. package/dist/providers/builders/ethersV5.test.js.map +1 -0
  113. package/dist/providers/builders/radix.browser.d.ts +1 -0
  114. package/dist/providers/builders/radix.browser.d.ts.map +1 -1
  115. package/dist/providers/builders/radix.browser.js +1 -0
  116. package/dist/providers/builders/radix.browser.js.map +1 -1
  117. package/dist/providers/builders/radix.d.ts.map +1 -1
  118. package/dist/providers/builders/radix.gateway.test.d.ts +2 -0
  119. package/dist/providers/builders/radix.gateway.test.d.ts.map +1 -0
  120. package/dist/providers/builders/radix.gateway.test.js +39 -0
  121. package/dist/providers/builders/radix.gateway.test.js.map +1 -0
  122. package/dist/providers/builders/radix.js +1 -0
  123. package/dist/providers/builders/radix.js.map +1 -1
  124. package/dist/providers/builders/radix.test.js +1 -0
  125. package/dist/providers/builders/radix.test.js.map +1 -1
  126. package/dist/providers/providerBuilders.d.ts +1 -1
  127. package/dist/providers/providerBuilders.d.ts.map +1 -1
  128. package/dist/providers/providerBuilders.js +1 -1
  129. package/dist/providers/providerBuilders.js.map +1 -1
  130. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +60 -8
  131. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
  132. package/dist/test/errors.d.ts +21 -0
  133. package/dist/test/errors.d.ts.map +1 -1
  134. package/dist/test/errors.js +25 -0
  135. package/dist/test/errors.js.map +1 -1
  136. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +92 -7
  137. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -1
  138. package/dist/timelock/evm/errors.js +1 -1
  139. package/dist/timelock/evm/errors.js.map +1 -1
  140. package/dist/token/EvmWarpRouteReader.d.ts +26 -0
  141. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
  142. package/dist/token/EvmWarpRouteReader.hardhat-test.js +28 -3
  143. package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
  144. package/dist/token/EvmWarpRouteReader.js +137 -41
  145. package/dist/token/EvmWarpRouteReader.js.map +1 -1
  146. package/dist/token/EvmWarpRouteReader.test.js +381 -3
  147. package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
  148. package/dist/token/types.d.ts +1 -1
  149. package/dist/token/warpCheck.d.ts +1 -0
  150. package/dist/token/warpCheck.d.ts.map +1 -1
  151. package/dist/token/warpCheck.js +25 -2
  152. package/dist/token/warpCheck.js.map +1 -1
  153. package/dist/token/warpCheck.test.js +119 -0
  154. package/dist/token/warpCheck.test.js.map +1 -1
  155. package/dist/utils/contract.d.ts +32 -0
  156. package/dist/utils/contract.d.ts.map +1 -1
  157. package/dist/utils/contract.js +90 -3
  158. package/dist/utils/contract.js.map +1 -1
  159. package/dist/utils/contract.test.js +402 -2
  160. package/dist/utils/contract.test.js.map +1 -1
  161. package/dist/utils/contract.transport.test.d.ts +2 -0
  162. package/dist/utils/contract.transport.test.d.ts.map +1 -0
  163. package/dist/utils/contract.transport.test.js +145 -0
  164. package/dist/utils/contract.transport.test.js.map +1 -0
  165. package/dist/utils/ism.d.ts +12 -6
  166. package/dist/utils/ism.d.ts.map +1 -1
  167. package/dist/utils/ism.js +92 -41
  168. package/dist/utils/ism.js.map +1 -1
  169. package/dist/utils/ism.test.js +75 -2
  170. package/dist/utils/ism.test.js.map +1 -1
  171. package/package.json +29 -15
@@ -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: 'aggregation',
606
+ type: CompositeIsmNodeType.AGGREGATION,
490
607
  threshold: 2,
491
608
  subIsms: [
492
- { type: 'trustedRelayer', relayer: SEALEVEL_ADDRESS },
493
609
  {
494
- type: 'routing',
610
+ type: CompositeIsmNodeType.TRUSTED_RELAYER,
611
+ relayer: SEALEVEL_ADDRESS,
612
+ },
613
+ {
614
+ type: CompositeIsmNodeType.ROUTING,
495
615
  domains: {
496
- solanamainnet: { type: 'test', accept: true },
616
+ solanamainnet: { type: CompositeIsmNodeType.TEST, accept: true },
497
617
  },
498
618
  },
499
619
  {
500
- type: 'amountRouting',
620
+ type: CompositeIsmNodeType.AMOUNT_ROUTING,
501
621
  threshold: '1000000',
502
- lower: { type: 'pausable', paused: false },
622
+ lower: { type: CompositeIsmNodeType.PAUSABLE, paused: false },
503
623
  upper: {
504
- type: 'rateLimited',
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('compositeIsm');
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: 'aggregation',
658
+ type: CompositeIsmNodeType.AGGREGATION,
539
659
  threshold: 5,
540
- subIsms: [{ type: 'trustedRelayer', relayer: SEALEVEL_ADDRESS }],
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: 'aggregation',
672
+ type: CompositeIsmNodeType.AGGREGATION,
548
673
  threshold: 0,
549
- subIsms: [{ type: 'trustedRelayer', relayer: SEALEVEL_ADDRESS }],
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: 'multisigMessageId',
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: 'multisigMessageId',
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: 'multisigMessageId',
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: 'multisigMessageId',
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 missing/zero recipient', () => {
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: 'rateLimited',
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 missingRecipient = {
739
+ const zeroRecipient = {
610
740
  ...sample,
611
741
  root: {
612
- type: 'rateLimited',
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(missingRecipient).success).to.be
748
+ expect(CompositeIsmConfigSchema.safeParse(zeroRecipient).success).to.be
618
749
  .false;
619
- const zeroRecipient = {
750
+ });
751
+ it('accepts a rateLimited node with an omitted recipient', () => {
752
+ const omittedRecipient = {
620
753
  ...sample,
621
754
  root: {
622
- type: 'rateLimited',
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(zeroRecipient).success).to.be
629
- .false;
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: 'rateLimited',
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: 'amountRouting',
796
+ type: CompositeIsmNodeType.AMOUNT_ROUTING,
648
797
  threshold: (2n ** 256n).toString(),
649
- lower: { type: 'test', accept: true },
650
- upper: { type: 'test', accept: false },
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: 'rateLimited',
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: 'multisigMessageId',
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: 'aggregation',
837
+ type: CompositeIsmNodeType.AGGREGATION,
689
838
  threshold: 256,
690
- subIsms: [{ type: 'trustedRelayer', relayer: SEALEVEL_ADDRESS }],
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: { type: 'trustedRelayer', relayer: SEALEVEL_ZERO_ADDRESS },
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: { type: 'trustedRelayer', relayer: SOME_ADDRESS },
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: { type: 'trustedRelayer', relayer: 'z'.repeat(32) },
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: { type: 'trustedRelayer', relayer: '1'.repeat(33) },
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: 'aggregation',
895
+ type: CompositeIsmNodeType.AGGREGATION,
730
896
  threshold: 1,
731
897
  subIsms: [
732
- { type: 'routing', domains: {} },
898
+ { type: CompositeIsmNodeType.ROUTING, domains: {} },
733
899
  {
734
- type: 'fallbackRouting',
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: 'fallbackRouting',
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: 'aggregation',
924
+ type: CompositeIsmNodeType.AGGREGATION,
759
925
  threshold: 2,
760
926
  subIsms: [
761
927
  {
762
- type: 'fallbackRouting',
928
+ type: CompositeIsmNodeType.FALLBACK_ROUTING,
763
929
  fallbackIsm: SEALEVEL_ADDRESS,
764
930
  domains: {},
765
931
  },
766
- { type: 'trustedRelayer', relayer: SEALEVEL_ADDRESS },
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: 'routing',
777
- domains: { ethereum: { type: 'routing', 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: 'routing',
956
+ type: CompositeIsmNodeType.ROUTING,
786
957
  domains: {
787
958
  ethereum: {
788
- type: 'fallbackRouting',
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: 'routing',
801
- domains: { ethereum: { type: 'pausable', paused: false } },
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: 'routing',
984
+ type: CompositeIsmNodeType.ROUTING,
812
985
  domains: {
813
986
  ethereum: {
814
- type: 'multisigMessageId',
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: { type: 'trustedRelayer', relayer: OTHER_SEALEVEL_ADDRESS },
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
  });