@hyperlane-xyz/sdk 44.0.2 → 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.
Files changed (189) hide show
  1. package/dist/consts/multisigIsm.d.ts.map +1 -1
  2. package/dist/consts/multisigIsm.js +104 -772
  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 +32 -43
  24. package/dist/deploy/warp.js.map +1 -1
  25. package/dist/deploy/warp.test.js +62 -1
  26. package/dist/deploy/warp.test.js.map +1 -1
  27. package/dist/gas/adapters/SealevelIgpAdapter.d.ts +3 -2
  28. package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -1
  29. package/dist/gas/adapters/SealevelIgpAdapter.js +3 -2
  30. package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/ism/EvmIsmModule.d.ts.map +1 -1
  36. package/dist/ism/EvmIsmModule.js +5 -1
  37. package/dist/ism/EvmIsmModule.js.map +1 -1
  38. package/dist/ism/EvmIsmModule.test.js +109 -0
  39. package/dist/ism/EvmIsmModule.test.js.map +1 -1
  40. package/dist/ism/HyperlaneIsmFactory.d.ts +26 -6
  41. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
  42. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +60 -0
  43. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
  44. package/dist/ism/HyperlaneIsmFactory.js +165 -34
  45. package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
  46. package/dist/ism/HyperlaneIsmFactory.test.js +33 -6
  47. package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -1
  48. package/dist/ism/types.d.ts +18 -2
  49. package/dist/ism/types.d.ts.map +1 -1
  50. package/dist/ism/types.js +43 -3
  51. package/dist/ism/types.js.map +1 -1
  52. package/dist/ism/types.test.js +232 -56
  53. package/dist/ism/types.test.js.map +1 -1
  54. package/dist/ism/utils.d.ts.map +1 -1
  55. package/dist/ism/utils.js +13 -0
  56. package/dist/ism/utils.js.map +1 -1
  57. package/dist/ism/utils.test.js +43 -1
  58. package/dist/ism/utils.test.js.map +1 -1
  59. package/dist/metadata/ChainMetadataManager.d.ts +1 -0
  60. package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
  61. package/dist/metadata/ChainMetadataManager.js +1 -0
  62. package/dist/metadata/ChainMetadataManager.js.map +1 -1
  63. package/dist/metadata/ChainMetadataManager.test.js +14 -1
  64. package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
  65. package/dist/metadata/ChainMetadataResolver.d.ts +1 -0
  66. package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -1
  67. package/dist/metadata/ChainMetadataResolver.js +1 -0
  68. package/dist/metadata/ChainMetadataResolver.js.map +1 -1
  69. package/dist/metadata/ChainMetadataResolver.test.js +4 -0
  70. package/dist/metadata/ChainMetadataResolver.test.js.map +1 -1
  71. package/dist/metadata/agentConfig.d.ts +209 -93
  72. package/dist/metadata/agentConfig.d.ts.map +1 -1
  73. package/dist/metadata/agentConfig.js +106 -13
  74. package/dist/metadata/agentConfig.js.map +1 -1
  75. package/dist/metadata/agentConfig.test.js +277 -25
  76. package/dist/metadata/agentConfig.test.js.map +1 -1
  77. package/dist/metadata/chainMetadata.test.js +25 -0
  78. package/dist/metadata/chainMetadata.test.js.map +1 -1
  79. package/dist/metadata/chainMetadataTypes.d.ts +36 -0
  80. package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
  81. package/dist/metadata/chainMetadataTypes.js +26 -0
  82. package/dist/metadata/chainMetadataTypes.js.map +1 -1
  83. package/dist/providers/SeismicSigner.d.ts +4 -12
  84. package/dist/providers/SeismicSigner.d.ts.map +1 -1
  85. package/dist/providers/SeismicSigner.js +84 -35
  86. package/dist/providers/SeismicSigner.js.map +1 -1
  87. package/dist/providers/SeismicSigner.test.d.ts +2 -0
  88. package/dist/providers/SeismicSigner.test.d.ts.map +1 -0
  89. package/dist/providers/SeismicSigner.test.js +160 -0
  90. package/dist/providers/SeismicSigner.test.js.map +1 -0
  91. package/dist/providers/SmartProvider/SmartProvider.d.ts +1 -5
  92. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
  93. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts +2 -0
  94. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts.map +1 -0
  95. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js +164 -0
  96. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js.map +1 -0
  97. package/dist/providers/SmartProvider/SmartProvider.js +35 -72
  98. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
  99. package/dist/providers/SmartProvider/SmartProvider.test.js +181 -2
  100. package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
  101. package/dist/providers/SmartProvider/jsonRpcError.d.ts +7 -0
  102. package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
  103. package/dist/providers/SmartProvider/jsonRpcError.js +67 -0
  104. package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
  105. package/dist/providers/SmartProvider/types.d.ts +1 -0
  106. package/dist/providers/SmartProvider/types.d.ts.map +1 -1
  107. package/dist/providers/builders/ethersV5.d.ts +0 -1
  108. package/dist/providers/builders/ethersV5.d.ts.map +1 -1
  109. package/dist/providers/builders/ethersV5.js +19 -5
  110. package/dist/providers/builders/ethersV5.js.map +1 -1
  111. package/dist/providers/builders/ethersV5.test.d.ts +2 -0
  112. package/dist/providers/builders/ethersV5.test.d.ts.map +1 -0
  113. package/dist/providers/builders/ethersV5.test.js +77 -0
  114. package/dist/providers/builders/ethersV5.test.js.map +1 -0
  115. package/dist/providers/builders/radix.browser.d.ts +1 -0
  116. package/dist/providers/builders/radix.browser.d.ts.map +1 -1
  117. package/dist/providers/builders/radix.browser.js +1 -0
  118. package/dist/providers/builders/radix.browser.js.map +1 -1
  119. package/dist/providers/builders/radix.d.ts.map +1 -1
  120. package/dist/providers/builders/radix.gateway.test.d.ts +2 -0
  121. package/dist/providers/builders/radix.gateway.test.d.ts.map +1 -0
  122. package/dist/providers/builders/radix.gateway.test.js +39 -0
  123. package/dist/providers/builders/radix.gateway.test.js.map +1 -0
  124. package/dist/providers/builders/radix.js +1 -0
  125. package/dist/providers/builders/radix.js.map +1 -1
  126. package/dist/providers/builders/radix.test.js +1 -0
  127. package/dist/providers/builders/radix.test.js.map +1 -1
  128. package/dist/providers/providerBuilders.d.ts +1 -1
  129. package/dist/providers/providerBuilders.d.ts.map +1 -1
  130. package/dist/providers/providerBuilders.js +1 -1
  131. package/dist/providers/providerBuilders.js.map +1 -1
  132. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +60 -8
  133. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
  134. package/dist/test/errors.d.ts +25 -0
  135. package/dist/test/errors.d.ts.map +1 -1
  136. package/dist/test/errors.js +31 -0
  137. package/dist/test/errors.js.map +1 -1
  138. package/dist/test/fixtures/warp-route-replay/record.d.ts +2 -0
  139. package/dist/test/fixtures/warp-route-replay/record.d.ts.map +1 -0
  140. package/dist/test/fixtures/warp-route-replay/record.js +32 -0
  141. package/dist/test/fixtures/warp-route-replay/record.js.map +1 -0
  142. package/dist/test/replayRpc.d.ts +82 -0
  143. package/dist/test/replayRpc.d.ts.map +1 -0
  144. package/dist/test/replayRpc.js +331 -0
  145. package/dist/test/replayRpc.js.map +1 -0
  146. package/dist/test/replayScenarios.d.ts +19 -0
  147. package/dist/test/replayScenarios.d.ts.map +1 -0
  148. package/dist/test/replayScenarios.js +89 -0
  149. package/dist/test/replayScenarios.js.map +1 -0
  150. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +92 -7
  151. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -1
  152. package/dist/timelock/evm/errors.js +1 -1
  153. package/dist/timelock/evm/errors.js.map +1 -1
  154. package/dist/token/EvmWarpRouteReader.d.ts +27 -0
  155. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
  156. package/dist/token/EvmWarpRouteReader.hardhat-test.js +28 -3
  157. package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
  158. package/dist/token/EvmWarpRouteReader.js +172 -42
  159. package/dist/token/EvmWarpRouteReader.js.map +1 -1
  160. package/dist/token/EvmWarpRouteReader.replay.test.d.ts +2 -0
  161. package/dist/token/EvmWarpRouteReader.replay.test.d.ts.map +1 -0
  162. package/dist/token/EvmWarpRouteReader.replay.test.js +392 -0
  163. package/dist/token/EvmWarpRouteReader.replay.test.js.map +1 -0
  164. package/dist/token/EvmWarpRouteReader.test.js +529 -4
  165. package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
  166. package/dist/token/types.d.ts +1 -1
  167. package/dist/token/warpCheck.d.ts +1 -0
  168. package/dist/token/warpCheck.d.ts.map +1 -1
  169. package/dist/token/warpCheck.js +25 -2
  170. package/dist/token/warpCheck.js.map +1 -1
  171. package/dist/token/warpCheck.test.js +119 -0
  172. package/dist/token/warpCheck.test.js.map +1 -1
  173. package/dist/utils/contract.d.ts +33 -0
  174. package/dist/utils/contract.d.ts.map +1 -1
  175. package/dist/utils/contract.js +116 -3
  176. package/dist/utils/contract.js.map +1 -1
  177. package/dist/utils/contract.test.js +465 -2
  178. package/dist/utils/contract.test.js.map +1 -1
  179. package/dist/utils/contract.transport.test.d.ts +2 -0
  180. package/dist/utils/contract.transport.test.d.ts.map +1 -0
  181. package/dist/utils/contract.transport.test.js +145 -0
  182. package/dist/utils/contract.transport.test.js.map +1 -0
  183. package/dist/utils/ism.d.ts +12 -6
  184. package/dist/utils/ism.d.ts.map +1 -1
  185. package/dist/utils/ism.js +92 -41
  186. package/dist/utils/ism.js.map +1 -1
  187. package/dist/utils/ism.test.js +75 -2
  188. package/dist/utils/ism.test.js.map +1 -1
  189. package/package.json +29 -15
@@ -0,0 +1,160 @@
1
+ import chai, { expect } from 'chai';
2
+ import chaiAsPromised from 'chai-as-promised';
3
+ import { BigNumber, Wallet, utils } from 'ethers';
4
+ import { AesGcmCrypto, AesKeyDomain, encodeSeismicMetadataAsAAD, generateAesKey, } from 'seismic-viem';
5
+ import sinon from 'sinon';
6
+ import { isHex } from 'viem';
7
+ import { z } from 'zod';
8
+ import { assert } from '@hyperlane-xyz/utils';
9
+ import { SeismicSigner } from './SeismicSigner.js';
10
+ const CHAIN_ID = 5124;
11
+ const BLOCK_HASH = `0x${'ab'.repeat(32)}`;
12
+ const SERVER_KEY = `0x${'01'.repeat(32)}`;
13
+ const BLOCK_GAS_LIMIT = 45_000_000;
14
+ const RECIPIENT = '0x0000000000000000000000000000000000000012';
15
+ const DATA = '0x12345678';
16
+ chai.use(chaiAsPromised);
17
+ describe('SeismicSigner', () => {
18
+ let wallet;
19
+ let signer;
20
+ let requests;
21
+ let rpcChainId;
22
+ let estimateError;
23
+ beforeEach(() => {
24
+ wallet = Wallet.createRandom();
25
+ signer = new SeismicSigner(wallet, {
26
+ chainId: CHAIN_ID,
27
+ rpcUrl: 'https://seismic.example',
28
+ name: 'seismic',
29
+ });
30
+ requests = [];
31
+ rpcChainId = CHAIN_ID;
32
+ estimateError = undefined;
33
+ sinon.stub(globalThis, 'fetch').callsFake(async (_url, init) => {
34
+ assert(typeof init?.body === 'string', 'Expected JSON-RPC body');
35
+ const request = z
36
+ .object({
37
+ id: z.number(),
38
+ method: z.string(),
39
+ params: z.array(z.unknown()).optional(),
40
+ })
41
+ .parse(JSON.parse(init.body));
42
+ requests.push(request);
43
+ const results = {
44
+ seismic_getTeePublicKey: utils.computePublicKey(SERVER_KEY, true),
45
+ eth_chainId: utils.hexValue(rpcChainId),
46
+ eth_getTransactionCount: '0x7',
47
+ eth_getBlockByNumber: {
48
+ hash: BLOCK_HASH,
49
+ number: '0x64',
50
+ gasLimit: utils.hexValue(BLOCK_GAS_LIMIT),
51
+ transactions: [],
52
+ },
53
+ eth_estimateGas: '0x12345',
54
+ };
55
+ assert(request.method in results, `Unexpected RPC ${request.method}`);
56
+ const body = request.method === 'eth_estimateGas' && estimateError
57
+ ? { error: { code: -32602, message: estimateError } }
58
+ : { result: results[request.method] };
59
+ return new Response(JSON.stringify({ jsonrpc: '2.0', id: request.id, ...body }), { headers: { 'Content-Type': 'application/json' } });
60
+ });
61
+ });
62
+ afterEach(() => sinon.restore());
63
+ for (const to of [RECIPIENT, undefined]) {
64
+ it(`estimates an authenticated encrypted ${to ? 'call' : 'creation'} with fresh replay protection`, async () => {
65
+ const sign = sinon.spy(wallet, '_signTypedData');
66
+ const gas = await signer.estimateGas({
67
+ to: Promise.resolve(to),
68
+ data: Promise.resolve(DATA),
69
+ value: BigNumber.from(13),
70
+ });
71
+ expect(gas.toHexString()).to.equal('0x012345');
72
+ expect(sign.calledOnce).to.equal(true);
73
+ const [domain, types, message] = sign.firstCall.args;
74
+ expect(message).to.include({
75
+ chainId: CHAIN_ID,
76
+ nonce: 7n,
77
+ gasPrice: 0n,
78
+ gasLimit: BigInt(BLOCK_GAS_LIMIT),
79
+ to: to ?? '0x0000000000000000000000000000000000000000',
80
+ isCreate: to === undefined,
81
+ value: 13n,
82
+ messageVersion: 2,
83
+ recentBlockHash: BLOCK_HASH,
84
+ expiresAtBlock: 200n,
85
+ signedRead: true,
86
+ });
87
+ expect(types).not.to.have.property('EIP712Domain');
88
+ expect(utils.verifyTypedData(domain, types, message, await sign.firstCall.returnValue)).to.equal(wallet.address);
89
+ const encrypted = z
90
+ .object({
91
+ encryptionPubkey: z.string().refine(isHex),
92
+ encryptionNonce: z.string().refine(isHex),
93
+ input: z.string().refine(isHex),
94
+ })
95
+ .parse(message);
96
+ assert(isHex(SERVER_KEY) && isHex(BLOCK_HASH) && isHex(wallet.address), 'Expected test hex');
97
+ assert(to === undefined || isHex(to), 'Expected test recipient');
98
+ assert(isHex(encrypted.encryptionPubkey) &&
99
+ isHex(encrypted.encryptionNonce) &&
100
+ isHex(encrypted.input), 'Expected encrypted hex');
101
+ const aesKey = generateAesKey({
102
+ privateKey: SERVER_KEY,
103
+ networkPublicKey: encrypted.encryptionPubkey.slice(2),
104
+ }, AesKeyDomain.TxRequest);
105
+ const aad = encodeSeismicMetadataAsAAD({
106
+ sender: wallet.address,
107
+ legacyFields: { chainId: CHAIN_ID, nonce: 7, to, value: 13n },
108
+ seismicElements: {
109
+ encryptionPubkey: encrypted.encryptionPubkey,
110
+ encryptionNonce: encrypted.encryptionNonce,
111
+ messageVersion: 2,
112
+ recentBlockHash: BLOCK_HASH,
113
+ expiresAtBlock: 200n,
114
+ signedRead: true,
115
+ },
116
+ });
117
+ expect(await new AesGcmCrypto(aesKey).decrypt(encrypted.input, encrypted.encryptionNonce, aad)).to.equal(DATA);
118
+ const estimate = requests.find(({ method }) => method === 'eth_estimateGas');
119
+ expect(estimate?.params).to.have.length(1);
120
+ expect(estimate?.params?.[0]).to.have.keys('data', 'signature');
121
+ expect(requests.find(({ method }) => method === 'eth_getTransactionCount')
122
+ ?.params).to.deep.equal([wallet.address, 'pending']);
123
+ expect(requests.some(({ method }) => method === 'eth_sendRawTransaction')).to.equal(false);
124
+ });
125
+ }
126
+ it('preserves an explicit nonce and generates fresh encryption for each estimate', async () => {
127
+ const sign = sinon.spy(wallet, '_signTypedData');
128
+ await signer.estimateGas({ to: RECIPIENT, data: DATA, nonce: 0 });
129
+ await signer.estimateGas({ to: RECIPIENT, data: DATA, nonce: 0 });
130
+ expect(sign.firstCall.args[2].nonce).to.equal(0n);
131
+ expect(sign.secondCall.args[2].encryptionNonce).not.to.equal(sign.firstCall.args[2].encryptionNonce);
132
+ expect(requests.some(({ method }) => method === 'eth_getTransactionCount')).to.equal(false);
133
+ });
134
+ for (const error of [
135
+ 'signed read missing seismic_elements',
136
+ 'execution reverted: Ownable: caller is not the owner',
137
+ ]) {
138
+ it(`propagates ${error}`, async () => {
139
+ estimateError = error;
140
+ await expect(signer.estimateGas({ to: RECIPIENT, data: DATA })).to.be.rejectedWith(error);
141
+ });
142
+ }
143
+ it('rejects a mismatched RPC chain before signing', async () => {
144
+ rpcChainId = CHAIN_ID + 1;
145
+ const sign = sinon.spy(wallet, '_signTypedData');
146
+ await expect(signer.estimateGas({ to: RECIPIENT })).to.be.rejectedWith('Seismic RPC chainId mismatch');
147
+ expect(sign.called).to.equal(false);
148
+ });
149
+ it('rejects mismatched transaction sender and chain before requesting RPC', async () => {
150
+ await expect(signer.estimateGas({ from: RECIPIENT })).to.be.rejectedWith('from does not match');
151
+ await expect(signer.estimateGas({ chainId: CHAIN_ID + 1 })).to.be.rejectedWith('chainId does not match');
152
+ expect(requests).to.have.length(0);
153
+ });
154
+ it('fails clearly for signers without typed-data support', async () => {
155
+ Object.defineProperty(wallet, '_signTypedData', { value: undefined });
156
+ await expect(signer.estimateGas({ to: RECIPIENT })).to.be.rejectedWith('requires EIP-712');
157
+ expect(requests).to.have.length(0);
158
+ });
159
+ });
160
+ //# sourceMappingURL=SeismicSigner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeismicSigner.test.js","sourceRoot":"","sources":["../../src/providers/SeismicSigner.test.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,6 @@ import { IProviderMethods, ProviderMethod } from './ProviderMethods.js';
7
7
  import { ChainMetadataWithRpcConnectionInfo, HyperlaneLogFilter, ProviderPerformResult, SmartProviderOptions } from './types.js';
8
8
  export declare function getSmartProviderErrorMessage(errorMsg: string): string;
9
9
  type HyperlaneProvider = HyperlaneEtherscanProvider | HyperlaneJsonRpcProvider;
10
- export declare function getNestedJsonRpcError(error: unknown): {
11
- code?: number | string;
12
- message?: string;
13
- };
14
10
  export declare class BlockchainError extends Error {
15
11
  readonly isRecoverable = false;
16
12
  constructor(message: string, options?: {
@@ -54,7 +50,7 @@ export declare class HyperlaneSmartProvider extends providers.BaseProvider imple
54
50
  }, providers: Array<HyperlaneEtherscanProvider | HyperlaneJsonRpcProvider>, reqId: number): Promise<any>;
55
51
  protected wrapProviderPerform(provider: HyperlaneProvider, pIndex: number, method: string, params: any, reqId: number): Promise<ProviderPerformResult>;
56
52
  protected waitForProviderSuccess(resultPromises: Promise<ProviderPerformResult>[]): Promise<ProviderPerformResult>;
57
- protected getCombinedProviderError(errors: any[], fallbackMsg: string): new () => Error;
53
+ protected getCombinedProviderError(errors: any[], fallbackMsg: string, method: string): new () => Error;
58
54
  }
59
55
  export {};
60
56
  //# sourceMappingURL=SmartProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SmartProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/SmartProvider/SmartProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SmartProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/SmartProvider/SmartProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SmartProvider.emptyResponse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartProvider.emptyResponse.test.d.ts","sourceRoot":"","sources":["../../../src/providers/SmartProvider/SmartProvider.emptyResponse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import { expect } from 'chai';
2
+ import http from 'http';
3
+ import { assert } from '@hyperlane-xyz/utils';
4
+ import { isMissingSelectorCallException } from '../../utils/contract.js';
5
+ import { HyperlaneSmartProvider } from './SmartProvider.js';
6
+ const CHAIN_ID = 1;
7
+ const FALLBACK_STAGGER_MS = 50;
8
+ const LATE_SLOW_MS = 300;
9
+ const LATE_FAST_MS = 150;
10
+ const CALL_PARAMS = { to: '0x' + '11'.repeat(20), data: '0x12345678' };
11
+ const EthMethod = {
12
+ ChainId: 'eth_chainId',
13
+ Call: 'eth_call',
14
+ };
15
+ const Behavior = {
16
+ Hang: 'hang',
17
+ Empty: 'empty',
18
+ Data: 'data',
19
+ ServerError: 'serverError',
20
+ };
21
+ const DATA_RESULT = '0x' + '00'.repeat(31) + '01';
22
+ function isJsonRpcRequest(value) {
23
+ return (typeof value === 'object' &&
24
+ value !== null &&
25
+ 'id' in value &&
26
+ typeof value.id === 'number' &&
27
+ 'method' in value &&
28
+ typeof value.method === 'string');
29
+ }
30
+ async function startServer(callBehavior, sockets, replyDelayMs = 0) {
31
+ const server = http.createServer((req, res) => {
32
+ const chunks = [];
33
+ req.on('data', (chunk) => chunks.push(chunk));
34
+ req.on('end', () => {
35
+ const body = JSON.parse(Buffer.concat(chunks).toString());
36
+ assertRequest(body);
37
+ const reply = (result) => {
38
+ res.setHeader('content-type', 'application/json');
39
+ res.end(JSON.stringify({ jsonrpc: '2.0', id: body.id, result }));
40
+ };
41
+ if (body.method === EthMethod.ChainId) {
42
+ reply('0x' + CHAIN_ID.toString(16));
43
+ return;
44
+ }
45
+ if (body.method !== EthMethod.Call) {
46
+ res.statusCode = 500;
47
+ res.end();
48
+ return;
49
+ }
50
+ const respond = (send) => {
51
+ if (replyDelayMs > 0)
52
+ setTimeout(send, replyDelayMs);
53
+ else
54
+ send();
55
+ };
56
+ switch (callBehavior) {
57
+ case Behavior.Hang:
58
+ sockets.add(res);
59
+ return;
60
+ case Behavior.Empty:
61
+ respond(() => reply('0x'));
62
+ return;
63
+ case Behavior.Data:
64
+ reply(DATA_RESULT);
65
+ return;
66
+ case Behavior.ServerError:
67
+ respond(() => {
68
+ res.statusCode = 500;
69
+ res.end('Internal Server Error');
70
+ });
71
+ return;
72
+ }
73
+ });
74
+ });
75
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
76
+ const address = server.address();
77
+ assert(address && typeof address === 'object', 'Server not listening');
78
+ return { server, url: `http://127.0.0.1:${address.port}` };
79
+ }
80
+ function assertRequest(body) {
81
+ if (!isJsonRpcRequest(body))
82
+ throw new Error('Unexpected JSON-RPC body');
83
+ }
84
+ describe('HyperlaneSmartProvider empty response next to failing providers', function () {
85
+ this.timeout(10_000);
86
+ const servers = [];
87
+ const hanging = new Set();
88
+ async function makeProvider(firstBehavior, otherBehavior, firstDelayMs = 0, otherDelayMs = 0) {
89
+ const a = await startServer(firstBehavior, hanging, firstDelayMs);
90
+ const b = await startServer(otherBehavior, hanging, otherDelayMs);
91
+ servers.push(a.server, b.server);
92
+ return new HyperlaneSmartProvider({ chainId: CHAIN_ID, name: 'test' }, [{ http: a.url }, { http: b.url }], [], { fallbackStaggerMs: FALLBACK_STAGGER_MS });
93
+ }
94
+ afterEach(async () => {
95
+ for (const res of hanging)
96
+ res.destroy();
97
+ hanging.clear();
98
+ await Promise.all(servers.splice(0).map((server) => new Promise((resolve) => {
99
+ server.closeAllConnections();
100
+ server.close(() => resolve());
101
+ })));
102
+ });
103
+ const cases = [
104
+ {
105
+ name: 'a hanging provider and an empty response',
106
+ first: Behavior.Hang,
107
+ other: Behavior.Empty,
108
+ missingSelector: true,
109
+ },
110
+ {
111
+ name: 'a server error and an empty response',
112
+ first: Behavior.ServerError,
113
+ other: Behavior.Empty,
114
+ missingSelector: true,
115
+ },
116
+ {
117
+ name: 'two server errors',
118
+ first: Behavior.ServerError,
119
+ other: Behavior.ServerError,
120
+ missingSelector: false,
121
+ },
122
+ {
123
+ name: 'a hanging provider and a server error',
124
+ first: Behavior.Hang,
125
+ other: Behavior.ServerError,
126
+ missingSelector: false,
127
+ },
128
+ {
129
+ name: 'a late empty response and an earlier late server error',
130
+ first: Behavior.Empty,
131
+ other: Behavior.ServerError,
132
+ firstDelayMs: LATE_SLOW_MS,
133
+ otherDelayMs: LATE_FAST_MS,
134
+ missingSelector: true,
135
+ },
136
+ {
137
+ name: 'two late server errors',
138
+ first: Behavior.ServerError,
139
+ other: Behavior.ServerError,
140
+ firstDelayMs: LATE_SLOW_MS,
141
+ otherDelayMs: LATE_FAST_MS,
142
+ missingSelector: false,
143
+ },
144
+ ];
145
+ for (const c of cases) {
146
+ it(`classifies an eth_call failing with ${c.name} as missing selector=${c.missingSelector}`, async () => {
147
+ const provider = await makeProvider(c.first, c.other, c.firstDelayMs, c.otherDelayMs);
148
+ let thrown;
149
+ try {
150
+ await provider.call(CALL_PARAMS);
151
+ }
152
+ catch (error) {
153
+ thrown = error;
154
+ }
155
+ expect(thrown).to.be.instanceOf(Error);
156
+ expect(isMissingSelectorCallException(thrown)).to.equal(c.missingSelector);
157
+ });
158
+ }
159
+ it('resolves when the other provider returns data', async () => {
160
+ const provider = await makeProvider(Behavior.Hang, Behavior.Data);
161
+ expect(await provider.call(CALL_PARAMS)).to.equal(DATA_RESULT);
162
+ });
163
+ });
164
+ //# sourceMappingURL=SmartProvider.emptyResponse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartProvider.emptyResponse.test.js","sourceRoot":"","sources":["../../../src/providers/SmartProvider/SmartProvider.emptyResponse.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { isObjEmpty, raceWithContext, retryAsync, rootLogger, runWithTimeout, sl
3
3
  import { ExplorerFamily, } from '../../metadata/chainMetadataTypes.js';
4
4
  import { HyperlaneEtherscanProvider } from './HyperlaneEtherscanProvider.js';
5
5
  import { HyperlaneJsonRpcProvider, LogBlockRangeTooLargeError, } from './HyperlaneJsonRpcProvider.js';
6
+ import { getNestedJsonRpcError, isCallExceptionWithTransientRpcError, } from './jsonRpcError.js';
6
7
  import { ProviderMethod } from './ProviderMethods.js';
7
8
  import { getMultiAddressLogs, isMultiAddressFilter } from './logFilters.js';
8
9
  import { ProviderStatus, } from './types.js';
@@ -67,62 +68,6 @@ const DEFAULT_PHASE2_WAIT_MULTIPLIER = 20;
67
68
  function getErrorMessage(error) {
68
69
  return error instanceof Error ? error.message : undefined;
69
70
  }
70
- function isRecord(value) {
71
- return typeof value === 'object' && value !== null;
72
- }
73
- function getRecord(value) {
74
- return isRecord(value) ? value : undefined;
75
- }
76
- function getJsonRpcErrorCode(value) {
77
- if (!isRecord(value))
78
- return undefined;
79
- const code = value.code;
80
- return typeof code === 'number' || typeof code === 'string'
81
- ? code
82
- : undefined;
83
- }
84
- function getJsonRpcErrorMessage(value) {
85
- if (!isRecord(value))
86
- return undefined;
87
- return typeof value.message === 'string' ? value.message : undefined;
88
- }
89
- function parseJsonRpcErrorBody(body) {
90
- if (typeof body !== 'string')
91
- return {};
92
- try {
93
- const parsed = getRecord(JSON.parse(body));
94
- const error = getRecord(parsed?.error);
95
- return {
96
- code: getJsonRpcErrorCode(error),
97
- message: getJsonRpcErrorMessage(error),
98
- };
99
- }
100
- catch {
101
- return {};
102
- }
103
- }
104
- export function getNestedJsonRpcError(error) {
105
- const nested = getRecord(getRecord(error)?.error);
106
- const nestedError = getRecord(nested?.error);
107
- const nestedBody = parseJsonRpcErrorBody(nested?.body);
108
- return {
109
- code: getJsonRpcErrorCode(nestedError) ??
110
- getJsonRpcErrorCode(nested) ??
111
- nestedBody.code,
112
- message: getJsonRpcErrorMessage(nestedError) ??
113
- getJsonRpcErrorMessage(nested) ??
114
- nestedBody.message,
115
- };
116
- }
117
- function isCallExceptionWithTransientRpcError(error) {
118
- const record = getRecord(error);
119
- if (record?.code !== EthersError.CALL_EXCEPTION)
120
- return false;
121
- const hasRevertData = !!record.data && record.data !== '0x';
122
- const nestedError = record.error;
123
- const jsonRpcErrorCode = getNestedJsonRpcError(error).code;
124
- return !!nestedError && !hasRevertData && jsonRpcErrorCode !== 3;
125
- }
126
71
  function errorChainHasMessage(error, message) {
127
72
  let current = error;
128
73
  while (current instanceof Error) {
@@ -132,8 +77,11 @@ function errorChainHasMessage(error, message) {
132
77
  }
133
78
  return false;
134
79
  }
80
+ function isEmptyProviderResponse(error) {
81
+ return errorChainHasMessage(error, 'Invalid response from provider');
82
+ }
135
83
  function getMostDiagnosticUnhandledError(errors) {
136
- return (errors.find((error) => errorChainHasMessage(error, 'Invalid response from provider')) ?? errors[0]);
84
+ return errors.find(isEmptyProviderResponse) ?? errors[0];
137
85
  }
138
86
  export class BlockchainError extends Error {
139
87
  isRecoverable = false;
@@ -395,7 +343,7 @@ export class HyperlaneSmartProvider extends providers.BaseProvider {
395
343
  // Phase 2: All providers already triggered, wait for one to complete or all to fail/timeout
396
344
  // If no providers are left, all have already failed
397
345
  if (providerResultPromises.length === 0) {
398
- const CombinedError = this.getCombinedProviderError(providerResultErrors, `All providers failed on chain ${this.network.name} for method ${method} and params ${JSON.stringify(params, null, 2)}`);
346
+ const CombinedError = this.getCombinedProviderError(providerResultErrors, `All providers failed on chain ${this.network.name} for method ${method} and params ${JSON.stringify(params, null, 2)}`, method);
399
347
  throw new CombinedError();
400
348
  }
401
349
  // Wait for at least one provider to succeed or all to fail/timeout
@@ -406,11 +354,15 @@ export class HyperlaneSmartProvider extends providers.BaseProvider {
406
354
  case ProviderStatus.Success:
407
355
  return result.value;
408
356
  case ProviderStatus.Timeout: {
409
- const CombinedError = this.getCombinedProviderError([result, ...providerResultErrors], `All providers timed out on chain ${this.network.name} for method ${method}`);
357
+ const CombinedError = this.getCombinedProviderError([result, ...providerResultErrors], `All providers timed out on chain ${this.network.name} for method ${method}`, method);
410
358
  throw new CombinedError();
411
359
  }
412
360
  case ProviderStatus.Error: {
413
- const CombinedError = this.getCombinedProviderError([result.error, ...providerResultErrors], `All providers failed on chain ${this.network.name} for method ${method} and params ${JSON.stringify(params, null, 2)}`);
361
+ const CombinedError = this.getCombinedProviderError([
362
+ result.error,
363
+ ...(result.otherErrors ?? []),
364
+ ...providerResultErrors,
365
+ ], `All providers failed on chain ${this.network.name} for method ${method} and params ${JSON.stringify(params, null, 2)}`, method);
414
366
  throw new CombinedError();
415
367
  }
416
368
  default:
@@ -454,15 +406,18 @@ export class HyperlaneSmartProvider extends providers.BaseProvider {
454
406
  }
455
407
  }
456
408
  // If reached, all providers finished unsuccessfully
409
+ // The first error to arrive stays `error`; the rest are returned in
410
+ // `otherErrors` so the caller can combine them rather than pick by latency.
411
+ const [firstError, ...otherErrors] = combinedErrors;
457
412
  return {
458
413
  status: ProviderStatus.Error,
459
- // TODO combine errors
460
414
  error: combinedErrors.length
461
- ? combinedErrors[0]
415
+ ? firstError
462
416
  : new Error('Unknown error from provider'),
417
+ otherErrors,
463
418
  };
464
419
  }
465
- getCombinedProviderError(errors, fallbackMsg) {
420
+ getCombinedProviderError(errors, fallbackMsg, method) {
466
421
  this.logger.debug(fallbackMsg);
467
422
  if (errors.length === 0) {
468
423
  return class extends Error {
@@ -543,7 +498,12 @@ export class HyperlaneSmartProvider extends providers.BaseProvider {
543
498
  constructor() {
544
499
  super(getNestedJsonRpcError(rpcServerError).message ??
545
500
  rpcServerError.error?.message ?? // Server errors sometimes will not have an error.message
546
- getSmartProviderErrorMessage(rpcServerError.code), { cause: rpcServerError });
501
+ getSmartProviderErrorMessage(rpcServerError.code), {
502
+ // An empty response from one provider is the more diagnostic
503
+ // answer whatever else failed alongside it, matching the
504
+ // timeout branch below.
505
+ cause: errors.find((e) => e instanceof Error && isEmptyProviderResponse(e)) ?? rpcServerError,
506
+ });
547
507
  }
548
508
  };
549
509
  }
@@ -551,19 +511,22 @@ export class HyperlaneSmartProvider extends providers.BaseProvider {
551
511
  return class extends Error {
552
512
  constructor() {
553
513
  super(fallbackMsg, {
554
- cause: timedOutError,
514
+ cause: errors.find((e) => e instanceof Error && isEmptyProviderResponse(e)) ?? timedOutError,
555
515
  });
556
516
  }
557
517
  };
558
518
  }
559
519
  else {
560
- this.logger.warn({
561
- errors: errors.map((e) => ({
562
- code: e?.code,
563
- message: e?.message,
564
- name: e?.name,
565
- })),
566
- }, 'Unhandled error case in combined provider error handler');
520
+ if (method !== ProviderMethod.Call ||
521
+ !errors.every(isEmptyProviderResponse)) {
522
+ this.logger.warn({
523
+ errors: errors.map((e) => ({
524
+ code: e?.code,
525
+ message: e?.message,
526
+ name: e?.name,
527
+ })),
528
+ }, 'Unhandled error case in combined provider error handler');
529
+ }
567
530
  return class extends Error {
568
531
  constructor() {
569
532
  super(fallbackMsg, {