@hyperlane-xyz/sdk 19.5.0 → 19.6.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 (150) hide show
  1. package/dist/core/types.d.ts +430 -0
  2. package/dist/core/types.d.ts.map +1 -1
  3. package/dist/deploy/warp.d.ts.map +1 -1
  4. package/dist/deploy/warp.js +3 -1
  5. package/dist/deploy/warp.js.map +1 -1
  6. package/dist/fee/EvmTokenFeeDeployer.d.ts +16 -0
  7. package/dist/fee/EvmTokenFeeDeployer.d.ts.map +1 -0
  8. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.d.ts +2 -0
  9. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.d.ts.map +1 -0
  10. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js +133 -0
  11. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js.map +1 -0
  12. package/dist/fee/EvmTokenFeeDeployer.js +75 -0
  13. package/dist/fee/EvmTokenFeeDeployer.js.map +1 -0
  14. package/dist/fee/EvmTokenFeeModule.d.ts +40 -0
  15. package/dist/fee/EvmTokenFeeModule.d.ts.map +1 -0
  16. package/dist/fee/EvmTokenFeeModule.hardhat-test.d.ts +2 -0
  17. package/dist/fee/EvmTokenFeeModule.hardhat-test.d.ts.map +1 -0
  18. package/dist/fee/EvmTokenFeeModule.hardhat-test.js +215 -0
  19. package/dist/fee/EvmTokenFeeModule.hardhat-test.js.map +1 -0
  20. package/dist/fee/EvmTokenFeeModule.js +182 -0
  21. package/dist/fee/EvmTokenFeeModule.js.map +1 -0
  22. package/dist/fee/EvmTokenFeeReader.d.ts +25 -0
  23. package/dist/fee/EvmTokenFeeReader.d.ts.map +1 -0
  24. package/dist/fee/EvmTokenFeeReader.hardhat-test.d.ts +4 -0
  25. package/dist/fee/EvmTokenFeeReader.hardhat-test.d.ts.map +1 -0
  26. package/dist/fee/EvmTokenFeeReader.hardhat-test.js +133 -0
  27. package/dist/fee/EvmTokenFeeReader.hardhat-test.js.map +1 -0
  28. package/dist/fee/EvmTokenFeeReader.js +116 -0
  29. package/dist/fee/EvmTokenFeeReader.js.map +1 -0
  30. package/dist/fee/contracts.d.ts +9 -0
  31. package/dist/fee/contracts.d.ts.map +1 -0
  32. package/dist/fee/contracts.js +9 -0
  33. package/dist/fee/contracts.js.map +1 -0
  34. package/dist/fee/types.d.ts +386 -0
  35. package/dist/fee/types.d.ts.map +1 -0
  36. package/dist/fee/types.js +107 -0
  37. package/dist/fee/types.js.map +1 -0
  38. package/dist/fee/utils.d.ts +10 -0
  39. package/dist/fee/utils.d.ts.map +1 -0
  40. package/dist/fee/utils.js +16 -0
  41. package/dist/fee/utils.js.map +1 -0
  42. package/dist/fork/types.d.ts +15 -15
  43. package/dist/ica/types.d.ts +322 -0
  44. package/dist/ica/types.d.ts.map +1 -1
  45. package/dist/index.d.ts +8 -3
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +7 -2
  48. package/dist/index.js.map +1 -1
  49. package/dist/ism/serialization.d.ts +37 -0
  50. package/dist/ism/serialization.d.ts.map +1 -0
  51. package/dist/ism/serialization.js +96 -0
  52. package/dist/ism/serialization.js.map +1 -0
  53. package/dist/mailbox/serialization.d.ts +41 -0
  54. package/dist/mailbox/serialization.d.ts.map +1 -0
  55. package/dist/mailbox/serialization.js +104 -0
  56. package/dist/mailbox/serialization.js.map +1 -0
  57. package/dist/metadata/agentConfig.d.ts +4 -4
  58. package/dist/router/HyperlaneRouterDeployer.d.ts +1 -0
  59. package/dist/router/HyperlaneRouterDeployer.d.ts.map +1 -1
  60. package/dist/router/HyperlaneRouterDeployer.js +12 -0
  61. package/dist/router/HyperlaneRouterDeployer.js.map +1 -1
  62. package/dist/router/types.d.ts +326 -1
  63. package/dist/router/types.d.ts.map +1 -1
  64. package/dist/router/types.js +2 -0
  65. package/dist/router/types.js.map +1 -1
  66. package/dist/token/EvmERC20WarpModule.d.ts +14 -1
  67. package/dist/token/EvmERC20WarpModule.d.ts.map +1 -1
  68. package/dist/token/EvmERC20WarpModule.hardhat-test.js +415 -25
  69. package/dist/token/EvmERC20WarpModule.hardhat-test.js.map +1 -1
  70. package/dist/token/EvmERC20WarpModule.js +172 -5
  71. package/dist/token/EvmERC20WarpModule.js.map +1 -1
  72. package/dist/token/EvmERC20WarpRouteReader.d.ts +8 -0
  73. package/dist/token/EvmERC20WarpRouteReader.d.ts.map +1 -1
  74. package/dist/token/EvmERC20WarpRouteReader.hardhat-test.js +141 -3
  75. package/dist/token/EvmERC20WarpRouteReader.hardhat-test.js.map +1 -1
  76. package/dist/token/EvmERC20WarpRouteReader.js +162 -34
  77. package/dist/token/EvmERC20WarpRouteReader.js.map +1 -1
  78. package/dist/token/Token.js +2 -2
  79. package/dist/token/Token.js.map +1 -1
  80. package/dist/token/Token.test.js +6 -0
  81. package/dist/token/Token.test.js.map +1 -1
  82. package/dist/token/TokenStandard.d.ts +2 -0
  83. package/dist/token/TokenStandard.d.ts.map +1 -1
  84. package/dist/token/TokenStandard.js +6 -0
  85. package/dist/token/TokenStandard.js.map +1 -1
  86. package/dist/token/adapters/CosmWasmTokenAdapter.d.ts +3 -3
  87. package/dist/token/adapters/CosmWasmTokenAdapter.d.ts.map +1 -1
  88. package/dist/token/adapters/CosmWasmTokenAdapter.js +7 -7
  89. package/dist/token/adapters/CosmWasmTokenAdapter.js.map +1 -1
  90. package/dist/token/adapters/CosmosModuleTokenAdapter.d.ts +2 -2
  91. package/dist/token/adapters/CosmosModuleTokenAdapter.d.ts.map +1 -1
  92. package/dist/token/adapters/CosmosModuleTokenAdapter.js +13 -7
  93. package/dist/token/adapters/CosmosModuleTokenAdapter.js.map +1 -1
  94. package/dist/token/adapters/CosmosTokenAdapter.d.ts +3 -3
  95. package/dist/token/adapters/CosmosTokenAdapter.d.ts.map +1 -1
  96. package/dist/token/adapters/CosmosTokenAdapter.js +15 -7
  97. package/dist/token/adapters/CosmosTokenAdapter.js.map +1 -1
  98. package/dist/token/adapters/EvmTokenAdapter.d.ts +13 -8
  99. package/dist/token/adapters/EvmTokenAdapter.d.ts.map +1 -1
  100. package/dist/token/adapters/EvmTokenAdapter.js +92 -41
  101. package/dist/token/adapters/EvmTokenAdapter.js.map +1 -1
  102. package/dist/token/adapters/ITokenAdapter.d.ts +14 -3
  103. package/dist/token/adapters/ITokenAdapter.d.ts.map +1 -1
  104. package/dist/token/adapters/M0PortalLiteTokenAdapter.d.ts +2 -2
  105. package/dist/token/adapters/M0PortalLiteTokenAdapter.d.ts.map +1 -1
  106. package/dist/token/adapters/M0PortalLiteTokenAdapter.js +10 -4
  107. package/dist/token/adapters/M0PortalLiteTokenAdapter.js.map +1 -1
  108. package/dist/token/adapters/RadixTokenAdapter.d.ts +2 -2
  109. package/dist/token/adapters/RadixTokenAdapter.d.ts.map +1 -1
  110. package/dist/token/adapters/RadixTokenAdapter.js +11 -7
  111. package/dist/token/adapters/RadixTokenAdapter.js.map +1 -1
  112. package/dist/token/adapters/SealevelTokenAdapter.d.ts +2 -2
  113. package/dist/token/adapters/SealevelTokenAdapter.d.ts.map +1 -1
  114. package/dist/token/adapters/SealevelTokenAdapter.js +5 -6
  115. package/dist/token/adapters/SealevelTokenAdapter.js.map +1 -1
  116. package/dist/token/adapters/StarknetTokenAdapter.d.ts +2 -2
  117. package/dist/token/adapters/StarknetTokenAdapter.d.ts.map +1 -1
  118. package/dist/token/adapters/StarknetTokenAdapter.js +6 -6
  119. package/dist/token/adapters/StarknetTokenAdapter.js.map +1 -1
  120. package/dist/token/config.d.ts +7 -2
  121. package/dist/token/config.d.ts.map +1 -1
  122. package/dist/token/config.js +6 -2
  123. package/dist/token/config.js.map +1 -1
  124. package/dist/token/contracts.d.ts +7 -2
  125. package/dist/token/contracts.d.ts.map +1 -1
  126. package/dist/token/contracts.js +13 -2
  127. package/dist/token/contracts.js.map +1 -1
  128. package/dist/token/deploy.d.ts +7 -3
  129. package/dist/token/deploy.d.ts.map +1 -1
  130. package/dist/token/deploy.js +141 -16
  131. package/dist/token/deploy.js.map +1 -1
  132. package/dist/token/types.d.ts +19993 -1868
  133. package/dist/token/types.d.ts.map +1 -1
  134. package/dist/token/types.js +98 -3
  135. package/dist/token/types.js.map +1 -1
  136. package/dist/token/types.test.js +47 -1
  137. package/dist/token/types.test.js.map +1 -1
  138. package/dist/utils/contract.d.ts +2 -0
  139. package/dist/utils/contract.d.ts.map +1 -0
  140. package/dist/utils/contract.js +5 -0
  141. package/dist/utils/contract.js.map +1 -0
  142. package/dist/warp/WarpCore.d.ts +20 -10
  143. package/dist/warp/WarpCore.d.ts.map +1 -1
  144. package/dist/warp/WarpCore.js +111 -38
  145. package/dist/warp/WarpCore.js.map +1 -1
  146. package/dist/warp/WarpCore.test.js +17 -8
  147. package/dist/warp/WarpCore.test.js.map +1 -1
  148. package/dist/warp/types.d.ts +1 -0
  149. package/dist/warp/types.d.ts.map +1 -1
  150. package/package.json +6 -6
@@ -0,0 +1,133 @@
1
+ import { expect } from 'chai';
2
+ import hre from 'hardhat';
3
+ import { ERC20Test__factory } from '@hyperlane-xyz/core';
4
+ import { addressToBytes32, randomInt } from '@hyperlane-xyz/utils';
5
+ import { TestChainName } from '../consts/testChains.js';
6
+ import { MultiProvider } from '../providers/MultiProvider.js';
7
+ import { EvmTokenFeeDeployer } from './EvmTokenFeeDeployer.js';
8
+ import { BPS, HALF_AMOUNT, MAX_FEE } from './EvmTokenFeeReader.hardhat-test.js';
9
+ import { RoutingFeeConfigSchema, TokenFeeConfigSchema, TokenFeeType, } from './types.js';
10
+ import { convertToBps } from './utils.js';
11
+ describe('EvmTokenFeeDeployer', () => {
12
+ let multiProvider;
13
+ let deployer;
14
+ let token;
15
+ let signer;
16
+ beforeEach(async () => {
17
+ [signer] = await hre.ethers.getSigners();
18
+ multiProvider = MultiProvider.createTestMultiProvider({ signer });
19
+ deployer = new EvmTokenFeeDeployer(multiProvider, TestChainName.test2);
20
+ const factory = new ERC20Test__factory(signer);
21
+ token = await factory.deploy('fake', 'FAKE', '100000000000000000000', 18);
22
+ await token.deployed();
23
+ });
24
+ describe('basic config', () => {
25
+ const testCases = [
26
+ {
27
+ title: 'should deploy LinearFee with correct parameters',
28
+ config: {
29
+ type: TokenFeeType.LinearFee,
30
+ maxFee: MAX_FEE,
31
+ halfAmount: HALF_AMOUNT,
32
+ bps: BPS,
33
+ },
34
+ },
35
+ {
36
+ title: 'should deploy ProgressiveFee with correct parameters',
37
+ config: {
38
+ type: TokenFeeType.ProgressiveFee,
39
+ maxFee: MAX_FEE,
40
+ halfAmount: HALF_AMOUNT,
41
+ },
42
+ },
43
+ {
44
+ title: 'should deploy RegressiveFee with correct parameters',
45
+ config: {
46
+ type: TokenFeeType.RegressiveFee,
47
+ maxFee: MAX_FEE,
48
+ halfAmount: HALF_AMOUNT,
49
+ },
50
+ },
51
+ ];
52
+ for (const testCase of testCases) {
53
+ it(testCase.title, async () => {
54
+ const config = {
55
+ ...testCase.config,
56
+ owner: signer.address,
57
+ token: token.address,
58
+ };
59
+ const deployedContracts = await deployer.deploy({
60
+ [TestChainName.test2]: TokenFeeConfigSchema.parse(config),
61
+ });
62
+ const tokenFeeContract = deployedContracts[TestChainName.test2][config.type];
63
+ expect(await tokenFeeContract.owner()).to.equal(config.owner);
64
+ expect(await tokenFeeContract.token()).to.equal(config.token);
65
+ if (config.type === TokenFeeType.LinearFee)
66
+ expect(convertToBps((await tokenFeeContract.maxFee()).toBigInt(), (await tokenFeeContract.halfAmount()).toBigInt())).to.equal(config.bps);
67
+ });
68
+ }
69
+ });
70
+ it('should deploy RoutingFee with correct parameters', async () => {
71
+ const config = TokenFeeConfigSchema.parse({
72
+ type: TokenFeeType.RoutingFee,
73
+ owner: signer.address,
74
+ token: token.address,
75
+ });
76
+ const deployedContracts = await deployer.deploy({
77
+ [TestChainName.test2]: config,
78
+ });
79
+ const routingFeeContract = deployedContracts[TestChainName.test2][TokenFeeType.RoutingFee];
80
+ expect(await routingFeeContract.owner()).to.equal(config.owner);
81
+ expect(await routingFeeContract.token()).to.equal(config.token);
82
+ // Deploy and set a LinearFee
83
+ const linearFeeConfig = {
84
+ type: TokenFeeType.LinearFee,
85
+ token: token.address,
86
+ owner: signer.address,
87
+ maxFee: MAX_FEE,
88
+ halfAmount: HALF_AMOUNT,
89
+ bps: BPS,
90
+ };
91
+ const parsedConfig = TokenFeeConfigSchema.parse(linearFeeConfig);
92
+ const linearFeeDeployer = await deployer.deploy({
93
+ [TestChainName.test2]: parsedConfig,
94
+ });
95
+ const linearFeeContract = linearFeeDeployer[TestChainName.test2][TokenFeeType.LinearFee];
96
+ await routingFeeContract.setFeeContract(1, linearFeeContract.address);
97
+ const amount = randomInt(1, 10000000000000);
98
+ const quote = await routingFeeContract.quoteTransferRemote(1, addressToBytes32(signer.address), amount);
99
+ expect(quote.length).to.equal(1);
100
+ expect(quote[0].amount).to.be.equal((BigInt(amount) * BPS) / 10000n);
101
+ expect(quote[0].token).to.equal(token.address);
102
+ // If no fee contract is set, the quote should be zero
103
+ const quote2 = await routingFeeContract.quoteTransferRemote(122222, addressToBytes32(signer.address), MAX_FEE);
104
+ expect(quote2.length).to.equal(0);
105
+ });
106
+ it('should deploy RoutingFee with multiple fee contracts', async () => {
107
+ const config = RoutingFeeConfigSchema.parse({
108
+ type: TokenFeeType.RoutingFee,
109
+ owner: signer.address,
110
+ token: token.address,
111
+ feeContracts: {
112
+ [TestChainName.test2]: {
113
+ type: TokenFeeType.LinearFee,
114
+ token: token.address,
115
+ owner: signer.address,
116
+ maxFee: MAX_FEE,
117
+ halfAmount: HALF_AMOUNT,
118
+ bps: BPS,
119
+ },
120
+ },
121
+ });
122
+ const deployedContracts = await deployer.deploy({
123
+ [TestChainName.test2]: config,
124
+ });
125
+ const routingFeeContract = deployedContracts[TestChainName.test2][TokenFeeType.RoutingFee];
126
+ expect(await routingFeeContract.owner()).to.equal(config.owner);
127
+ expect(await routingFeeContract.token()).to.equal(config.token);
128
+ // Read the actual address of the deployed routing fee contract
129
+ const actualLinearFeeAddress = await routingFeeContract.feeContracts(multiProvider.getChainId(TestChainName.test2));
130
+ expect(actualLinearFeeAddress).to.equal(deployedContracts[TestChainName.test2][TokenFeeType.LinearFee].address);
131
+ });
132
+ });
133
+ //# sourceMappingURL=EvmTokenFeeDeployer.hardhat-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmTokenFeeDeployer.hardhat-test.js","sourceRoot":"","sources":["../../src/fee/EvmTokenFeeDeployer.hardhat-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { HyperlaneDeployer, } from '../deploy/HyperlaneDeployer.js';
2
+ import { EvmTokenFeeReader } from './EvmTokenFeeReader.js';
3
+ import { evmTokenFeeFactories } from './contracts.js';
4
+ import { TokenFeeConfigSchema, TokenFeeType, onChainTypeToTokenFeeTypeMap, } from './types.js';
5
+ export class EvmTokenFeeDeployer extends HyperlaneDeployer {
6
+ multiProvider;
7
+ chain;
8
+ tokenFeeReader;
9
+ constructor(multiProvider, chain, options = {}) {
10
+ super(multiProvider, evmTokenFeeFactories, options);
11
+ this.multiProvider = multiProvider;
12
+ this.chain = chain;
13
+ this.tokenFeeReader = new EvmTokenFeeReader(multiProvider, chain);
14
+ }
15
+ async deployContracts(chain, config) {
16
+ const deployedContract = {}; // This is a partial HyperlaneContracts<EvmTokenFeeFactories>
17
+ const parsedConfig = TokenFeeConfigSchema.parse(config);
18
+ switch (parsedConfig.type) {
19
+ case TokenFeeType.LinearFee:
20
+ case TokenFeeType.ProgressiveFee:
21
+ case TokenFeeType.RegressiveFee:
22
+ deployedContract[parsedConfig.type] = await this.deployFee(chain, parsedConfig);
23
+ break;
24
+ case TokenFeeType.RoutingFee: {
25
+ // Return the routing fee and all the child fee contracts
26
+ const routingFeeResult = await this.deployRoutingFee(chain, parsedConfig);
27
+ deployedContract[TokenFeeType.RoutingFee] = routingFeeResult.routingFee;
28
+ for (const [_, contract] of Object.entries(routingFeeResult.subFeeContracts)) {
29
+ const onchainFeeType = await contract.feeType();
30
+ const feeType = onChainTypeToTokenFeeTypeMap[onchainFeeType];
31
+ deployedContract[feeType] = contract;
32
+ }
33
+ break;
34
+ }
35
+ }
36
+ return deployedContract;
37
+ }
38
+ async deployFee(chain, config) {
39
+ let { maxFee, halfAmount } = config;
40
+ if (config.type === TokenFeeType.LinearFee &&
41
+ config.bps &&
42
+ (!maxFee || !halfAmount)) {
43
+ const { maxFee: calculatedMaxFee, halfAmount: calculatedHalfAmount } = await this.tokenFeeReader.convertFromBps(config.bps, config.token);
44
+ maxFee = calculatedMaxFee;
45
+ halfAmount = calculatedHalfAmount;
46
+ }
47
+ return this.deployContract(chain, config.type, [
48
+ config.token,
49
+ maxFee,
50
+ halfAmount,
51
+ config.owner,
52
+ ]);
53
+ }
54
+ async deployRoutingFee(chain, config) {
55
+ if (config.type !== TokenFeeType.RoutingFee) {
56
+ throw new Error('Invalid config type for routing fee deployment');
57
+ }
58
+ // Deploy the routing fee contract
59
+ const routingFee = await this.deployContract(chain, TokenFeeType.RoutingFee, [config.token, config.owner]);
60
+ const subFeeContracts = {};
61
+ if (config.feeContracts) {
62
+ // Deploy each fee contract & set each fee for the routing fee
63
+ for (const [destinationChain, feeConfig] of Object.entries(config.feeContracts)) {
64
+ const deployedFeeContract = await this.deployFee(chain, feeConfig);
65
+ await routingFee.setFeeContract(this.multiProvider.getChainId(destinationChain), deployedFeeContract.address);
66
+ subFeeContracts[destinationChain] = deployedFeeContract;
67
+ }
68
+ }
69
+ return {
70
+ routingFee,
71
+ subFeeContracts,
72
+ };
73
+ }
74
+ }
75
+ //# sourceMappingURL=EvmTokenFeeDeployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmTokenFeeDeployer.js","sourceRoot":"","sources":["../../src/fee/EvmTokenFeeDeployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Address, ProtocolType } from '@hyperlane-xyz/utils';
2
+ import { HyperlaneModule, HyperlaneModuleParams } from '../core/AbstractHyperlaneModule.js';
3
+ import { ContractVerifier } from '../deploy/verify/ContractVerifier.js';
4
+ import { MultiProvider } from '../providers/MultiProvider.js';
5
+ import { AnnotatedEV5Transaction } from '../providers/ProviderType.js';
6
+ import { ChainNameOrId } from '../types.js';
7
+ import { EvmTokenFeeDeployer } from './EvmTokenFeeDeployer.js';
8
+ import { DerivedTokenFeeConfig, EvmTokenFeeReader, TokenFeeReaderParams } from './EvmTokenFeeReader.js';
9
+ import { TokenFeeConfig, TokenFeeConfigInput } from './types.js';
10
+ type TokenFeeModuleAddresses = {
11
+ deployedFee: Address;
12
+ };
13
+ export declare class EvmTokenFeeModule extends HyperlaneModule<ProtocolType.Ethereum, TokenFeeConfigInput, TokenFeeModuleAddresses> {
14
+ protected readonly multiProvider: MultiProvider;
15
+ protected readonly contractVerifier?: ContractVerifier | undefined;
16
+ protected readonly logger: import("pino").default.Logger<never>;
17
+ protected readonly deployer: EvmTokenFeeDeployer;
18
+ protected readonly reader: EvmTokenFeeReader;
19
+ protected readonly chainName: string;
20
+ protected readonly chainId: number;
21
+ constructor(multiProvider: MultiProvider, params: HyperlaneModuleParams<TokenFeeConfigInput, TokenFeeModuleAddresses>, contractVerifier?: ContractVerifier | undefined);
22
+ static create({ multiProvider, chain, config, contractVerifier, }: {
23
+ multiProvider: MultiProvider;
24
+ chain: ChainNameOrId;
25
+ config: TokenFeeConfig;
26
+ contractVerifier?: ContractVerifier;
27
+ }): Promise<EvmTokenFeeModule>;
28
+ static expandConfig(params: {
29
+ config: TokenFeeConfigInput;
30
+ multiProvider: MultiProvider;
31
+ chainName: string;
32
+ }): Promise<TokenFeeConfig>;
33
+ private deploy;
34
+ read(params?: Partial<TokenFeeReaderParams>): Promise<DerivedTokenFeeConfig>;
35
+ update(targetConfig: TokenFeeConfigInput, params?: Partial<TokenFeeReaderParams>): Promise<AnnotatedEV5Transaction[]>;
36
+ private updateRoutingFee;
37
+ private createOwnershipUpdateTxs;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=EvmTokenFeeModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmTokenFeeModule.d.ts","sourceRoot":"","sources":["../../src/fee/EvmTokenFeeModule.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,EACP,YAAY,EAUb,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,eAAe,EACf,qBAAqB,EACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAEL,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,cAAc,EACd,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAEpB,KAAK,uBAAuB,GAAG;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,eAAe,CACpD,YAAY,CAAC,QAAQ,EACrB,mBAAmB,EACnB,uBAAuB,CACxB;IAOG,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAE/C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IARtC,SAAS,CAAC,QAAQ,CAAC,MAAM,uCAAqD;IAC9E,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACjD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,aAAa,EAAE,aAAa,EAC/C,MAAM,EAAE,qBAAqB,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,EACxD,gBAAgB,CAAC,8BAAkB;WAa3C,MAAM,CAAC,EAClB,aAAa,EACb,KAAK,EACL,MAAM,EACN,gBAAgB,GACjB,EAAE;QACD,aAAa,EAAE,aAAa,CAAC;QAC7B,KAAK,EAAE,aAAa,CAAC;QACrB,MAAM,EAAE,cAAc,CAAC;QACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC,GAAG,OAAO,CAAC,iBAAiB,CAAC;WA4BV,YAAY,CAAC,MAAM,EAAE;QACvC,MAAM,EAAE,mBAAmB,CAAC;QAC5B,aAAa,EAAE,aAAa,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,CAAC;YA2Db,MAAM;IAgBd,IAAI,CACR,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,OAAO,CAAC,qBAAqB,CAAC;IAU3B,MAAM,CACV,YAAY,EAAE,mBAAmB,EACjC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,OAAO,CAAC,uBAAuB,EAAE,CAAC;YAoEvB,gBAAgB;IA6C9B,OAAO,CAAC,wBAAwB;CAYjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EvmTokenFeeModule.hardhat-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmTokenFeeModule.hardhat-test.d.ts","sourceRoot":"","sources":["../../src/fee/EvmTokenFeeModule.hardhat-test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,215 @@
1
+ import { expect } from 'chai';
2
+ import { constants } from 'ethers';
3
+ import hre from 'hardhat';
4
+ import { ERC20Test__factory } from '@hyperlane-xyz/core';
5
+ import { assert } from '@hyperlane-xyz/utils';
6
+ import { TestChainName } from '../consts/testChains.js';
7
+ import { MultiProvider } from '../providers/MultiProvider.js';
8
+ import { randomAddress } from '../test/testUtils.js';
9
+ import { normalizeConfig } from '../utils/ism.js';
10
+ import { EvmTokenFeeModule } from './EvmTokenFeeModule.js';
11
+ import { BPS, HALF_AMOUNT, MAX_FEE } from './EvmTokenFeeReader.hardhat-test.js';
12
+ import { TokenFeeConfigSchema, TokenFeeType, } from './types.js';
13
+ describe('EvmTokenFeeModule', () => {
14
+ const test4Chain = TestChainName.test4;
15
+ let multiProvider;
16
+ let signer;
17
+ let token;
18
+ let config;
19
+ before(async () => {
20
+ [signer] = await hre.ethers.getSigners();
21
+ multiProvider = MultiProvider.createTestMultiProvider({ signer });
22
+ const factory = new ERC20Test__factory(signer);
23
+ token = await factory.deploy('fake', 'FAKE', '100000000000000000000', 18);
24
+ await token.deployed();
25
+ config = {
26
+ type: TokenFeeType.LinearFee,
27
+ owner: signer.address,
28
+ token: token.address,
29
+ maxFee: MAX_FEE,
30
+ halfAmount: HALF_AMOUNT,
31
+ bps: BPS,
32
+ };
33
+ });
34
+ async function expectTxsAndUpdate(feeModule, config, n, params) {
35
+ const txs = await feeModule.update(config, params);
36
+ expect(txs.length).to.equal(n);
37
+ for (const tx of txs) {
38
+ await multiProvider.sendTransaction(test4Chain, tx);
39
+ }
40
+ }
41
+ it('should create a new token fee', async () => {
42
+ const module = await EvmTokenFeeModule.create({
43
+ multiProvider,
44
+ chain: TestChainName.test2,
45
+ config,
46
+ });
47
+ const onchainConfig = await module.read();
48
+ expect(normalizeConfig(onchainConfig)).to.deep.equal(normalizeConfig({ ...config, maxFee: MAX_FEE, halfAmount: HALF_AMOUNT }));
49
+ });
50
+ it('should create a new token fee with bps', async () => {
51
+ const module = await EvmTokenFeeModule.create({
52
+ multiProvider,
53
+ chain: test4Chain,
54
+ config,
55
+ });
56
+ const onchainConfig = await module.read();
57
+ assert(onchainConfig.type === TokenFeeType.LinearFee, `Must be ${TokenFeeType.LinearFee}`);
58
+ assert(onchainConfig.type === TokenFeeType.LinearFee, `Must be ${TokenFeeType.LinearFee}`);
59
+ expect(onchainConfig.bps).to.equal(BPS);
60
+ });
61
+ it('should deploy and read the routing fee config', async () => {
62
+ const routingFeeConfig = {
63
+ feeContracts: {
64
+ [test4Chain]: config,
65
+ },
66
+ owner: signer.address,
67
+ token: token.address,
68
+ maxFee: constants.MaxUint256.toBigInt(),
69
+ halfAmount: constants.MaxUint256.toBigInt(),
70
+ type: TokenFeeType.RoutingFee,
71
+ };
72
+ const module = await EvmTokenFeeModule.create({
73
+ multiProvider,
74
+ chain: test4Chain,
75
+ config: routingFeeConfig,
76
+ });
77
+ const routingDestination = multiProvider.getDomainId(test4Chain);
78
+ const onchainConfig = await module.read({
79
+ routingDestinations: [routingDestination],
80
+ });
81
+ expect(normalizeConfig(onchainConfig)).to.deep.equal(normalizeConfig(routingFeeConfig));
82
+ });
83
+ describe('Update', async () => {
84
+ it('should not update if the linear configs are the same', async () => {
85
+ const module = await EvmTokenFeeModule.create({
86
+ multiProvider,
87
+ chain: test4Chain,
88
+ config,
89
+ });
90
+ const txs = await module.update(config);
91
+ expect(txs).to.have.lengthOf(0);
92
+ });
93
+ it('should not update if the routing configs are the same', async () => {
94
+ const routingConfig = TokenFeeConfigSchema.parse({
95
+ type: TokenFeeType.RoutingFee,
96
+ owner: signer.address,
97
+ token: token.address,
98
+ feeContracts: {
99
+ [test4Chain]: config,
100
+ },
101
+ });
102
+ const module = await EvmTokenFeeModule.create({
103
+ multiProvider,
104
+ chain: test4Chain,
105
+ config: routingConfig,
106
+ });
107
+ const chainId = multiProvider.getDomainId(test4Chain);
108
+ const txs = await module.update(routingConfig, {
109
+ routingDestinations: [chainId],
110
+ });
111
+ expect(txs).to.have.lengthOf(0);
112
+ });
113
+ it('should not update if providing a bps that is the same as the result of calculating with maxFee and halfAmount', async () => {
114
+ const module = await EvmTokenFeeModule.create({
115
+ multiProvider,
116
+ chain: test4Chain,
117
+ config,
118
+ });
119
+ const updatedConfig = {
120
+ type: TokenFeeType.LinearFee,
121
+ owner: config.owner,
122
+ token: config.token,
123
+ bps: BPS,
124
+ };
125
+ const txs = await module.update(updatedConfig);
126
+ expect(txs).to.have.lengthOf(0);
127
+ });
128
+ it(`should redeploy immutable fees if updating token for ${TokenFeeType.LinearFee}`, async () => {
129
+ const module = await EvmTokenFeeModule.create({
130
+ multiProvider,
131
+ chain: test4Chain,
132
+ config,
133
+ });
134
+ const updatedConfig = { ...config, bps: BPS + 1n };
135
+ await expectTxsAndUpdate(module, updatedConfig, 0);
136
+ const onchainConfig = await module.read();
137
+ assert(onchainConfig.type === TokenFeeType.LinearFee, `Must be ${TokenFeeType.LinearFee}`);
138
+ expect(onchainConfig.bps).to.eql(updatedConfig.bps);
139
+ });
140
+ it(`should redeploy immutable fees if updating token for ${TokenFeeType.RoutingFee}`, async () => {
141
+ const feeContracts = {
142
+ [test4Chain]: config,
143
+ };
144
+ const routingFeeConfig = {
145
+ type: TokenFeeType.RoutingFee,
146
+ owner: signer.address,
147
+ token: token.address,
148
+ feeContracts: feeContracts,
149
+ };
150
+ const module = await EvmTokenFeeModule.create({
151
+ multiProvider,
152
+ chain: test4Chain,
153
+ config: routingFeeConfig,
154
+ });
155
+ const updatedConfig = {
156
+ ...routingFeeConfig,
157
+ feeContracts: {
158
+ [test4Chain]: {
159
+ ...feeContracts[test4Chain],
160
+ bps: BPS + 1n,
161
+ },
162
+ },
163
+ };
164
+ await expectTxsAndUpdate(module, updatedConfig, 1, {
165
+ routingDestinations: [multiProvider.getDomainId(test4Chain)],
166
+ });
167
+ });
168
+ it('should transfer ownership if they are different', async () => {
169
+ const module = await EvmTokenFeeModule.create({
170
+ multiProvider,
171
+ chain: test4Chain,
172
+ config,
173
+ });
174
+ await expectTxsAndUpdate(module, { ...config, owner: config.owner }, 0);
175
+ const newOwner = randomAddress();
176
+ await expectTxsAndUpdate(module, { ...config, owner: newOwner }, 1);
177
+ const onchainConfig = await module.read();
178
+ assert(onchainConfig.type === TokenFeeType.LinearFee, `Must be ${TokenFeeType.LinearFee}`);
179
+ expect(normalizeConfig(onchainConfig).owner).to.equal(normalizeConfig(newOwner));
180
+ });
181
+ it('should transfer ownership for each routing sub fee', async () => {
182
+ const feeContracts = {
183
+ [test4Chain]: config,
184
+ };
185
+ const routingFeeConfig = {
186
+ type: TokenFeeType.RoutingFee,
187
+ owner: signer.address,
188
+ token: token.address,
189
+ feeContracts: feeContracts,
190
+ };
191
+ const module = await EvmTokenFeeModule.create({
192
+ multiProvider,
193
+ chain: test4Chain,
194
+ config: routingFeeConfig,
195
+ });
196
+ const newOwner = normalizeConfig(randomAddress());
197
+ await expectTxsAndUpdate(module, {
198
+ ...routingFeeConfig,
199
+ owner: newOwner,
200
+ feeContracts: {
201
+ [test4Chain]: { ...feeContracts[test4Chain], owner: newOwner },
202
+ },
203
+ }, 2, {
204
+ routingDestinations: [multiProvider.getDomainId(test4Chain)],
205
+ });
206
+ const onchainConfig = await module.read({
207
+ routingDestinations: [multiProvider.getDomainId(test4Chain)],
208
+ });
209
+ assert(onchainConfig.type === TokenFeeType.RoutingFee, `Must be ${TokenFeeType.RoutingFee}`);
210
+ expect(normalizeConfig(onchainConfig).owner).to.equal(newOwner);
211
+ expect(normalizeConfig(onchainConfig.feeContracts?.[test4Chain]).owner).to.equal(newOwner);
212
+ });
213
+ });
214
+ });
215
+ //# sourceMappingURL=EvmTokenFeeModule.hardhat-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmTokenFeeModule.hardhat-test.js","sourceRoot":"","sources":["../../src/fee/EvmTokenFeeModule.hardhat-test.ts"],"names":[],"mappings":"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"}