@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.
- package/dist/consts/multisigIsm.d.ts.map +1 -1
- package/dist/consts/multisigIsm.js +104 -772
- package/dist/consts/multisigIsm.js.map +1 -1
- package/dist/consts/testChains.d.ts.map +1 -1
- package/dist/consts/testChains.js +11 -6
- package/dist/consts/testChains.js.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.d.ts +6 -0
- package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.js +20 -0
- package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.test.js +17 -0
- package/dist/core/adapters/SealevelCoreAdapter.test.js.map +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/types.test.js +98 -1
- package/dist/core/types.test.js.map +1 -1
- package/dist/deploy/proxy.d.ts +1 -0
- package/dist/deploy/proxy.d.ts.map +1 -1
- package/dist/deploy/proxy.js +6 -0
- package/dist/deploy/proxy.js.map +1 -1
- package/dist/deploy/warp.d.ts.map +1 -1
- package/dist/deploy/warp.js +32 -43
- package/dist/deploy/warp.js.map +1 -1
- package/dist/deploy/warp.test.js +62 -1
- package/dist/deploy/warp.test.js.map +1 -1
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts +3 -2
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -1
- package/dist/gas/adapters/SealevelIgpAdapter.js +3 -2
- package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ism/EvmIsmModule.d.ts.map +1 -1
- package/dist/ism/EvmIsmModule.js +5 -1
- package/dist/ism/EvmIsmModule.js.map +1 -1
- package/dist/ism/EvmIsmModule.test.js +109 -0
- package/dist/ism/EvmIsmModule.test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.d.ts +26 -6
- package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +60 -0
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.js +165 -34
- package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.test.js +33 -6
- package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -1
- package/dist/ism/types.d.ts +18 -2
- package/dist/ism/types.d.ts.map +1 -1
- package/dist/ism/types.js +43 -3
- package/dist/ism/types.js.map +1 -1
- package/dist/ism/types.test.js +232 -56
- package/dist/ism/types.test.js.map +1 -1
- package/dist/ism/utils.d.ts.map +1 -1
- package/dist/ism/utils.js +13 -0
- package/dist/ism/utils.js.map +1 -1
- package/dist/ism/utils.test.js +43 -1
- package/dist/ism/utils.test.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.d.ts +1 -0
- package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
- package/dist/metadata/ChainMetadataManager.js +1 -0
- package/dist/metadata/ChainMetadataManager.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.test.js +14 -1
- package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
- package/dist/metadata/ChainMetadataResolver.d.ts +1 -0
- package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -1
- package/dist/metadata/ChainMetadataResolver.js +1 -0
- package/dist/metadata/ChainMetadataResolver.js.map +1 -1
- package/dist/metadata/ChainMetadataResolver.test.js +4 -0
- package/dist/metadata/ChainMetadataResolver.test.js.map +1 -1
- package/dist/metadata/agentConfig.d.ts +209 -93
- package/dist/metadata/agentConfig.d.ts.map +1 -1
- package/dist/metadata/agentConfig.js +106 -13
- package/dist/metadata/agentConfig.js.map +1 -1
- package/dist/metadata/agentConfig.test.js +277 -25
- package/dist/metadata/agentConfig.test.js.map +1 -1
- package/dist/metadata/chainMetadata.test.js +25 -0
- package/dist/metadata/chainMetadata.test.js.map +1 -1
- package/dist/metadata/chainMetadataTypes.d.ts +36 -0
- package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
- package/dist/metadata/chainMetadataTypes.js +26 -0
- package/dist/metadata/chainMetadataTypes.js.map +1 -1
- package/dist/providers/SeismicSigner.d.ts +4 -12
- package/dist/providers/SeismicSigner.d.ts.map +1 -1
- package/dist/providers/SeismicSigner.js +84 -35
- package/dist/providers/SeismicSigner.js.map +1 -1
- package/dist/providers/SeismicSigner.test.d.ts +2 -0
- package/dist/providers/SeismicSigner.test.d.ts.map +1 -0
- package/dist/providers/SeismicSigner.test.js +160 -0
- package/dist/providers/SeismicSigner.test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.d.ts +1 -5
- package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts +2 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js +164 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.js +35 -72
- package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.test.js +181 -2
- package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
- package/dist/providers/SmartProvider/jsonRpcError.d.ts +7 -0
- package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
- package/dist/providers/SmartProvider/jsonRpcError.js +67 -0
- package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
- package/dist/providers/SmartProvider/types.d.ts +1 -0
- package/dist/providers/SmartProvider/types.d.ts.map +1 -1
- package/dist/providers/builders/ethersV5.d.ts +0 -1
- package/dist/providers/builders/ethersV5.d.ts.map +1 -1
- package/dist/providers/builders/ethersV5.js +19 -5
- package/dist/providers/builders/ethersV5.js.map +1 -1
- package/dist/providers/builders/ethersV5.test.d.ts +2 -0
- package/dist/providers/builders/ethersV5.test.d.ts.map +1 -0
- package/dist/providers/builders/ethersV5.test.js +77 -0
- package/dist/providers/builders/ethersV5.test.js.map +1 -0
- package/dist/providers/builders/radix.browser.d.ts +1 -0
- package/dist/providers/builders/radix.browser.d.ts.map +1 -1
- package/dist/providers/builders/radix.browser.js +1 -0
- package/dist/providers/builders/radix.browser.js.map +1 -1
- package/dist/providers/builders/radix.d.ts.map +1 -1
- package/dist/providers/builders/radix.gateway.test.d.ts +2 -0
- package/dist/providers/builders/radix.gateway.test.d.ts.map +1 -0
- package/dist/providers/builders/radix.gateway.test.js +39 -0
- package/dist/providers/builders/radix.gateway.test.js.map +1 -0
- package/dist/providers/builders/radix.js +1 -0
- package/dist/providers/builders/radix.js.map +1 -1
- package/dist/providers/builders/radix.test.js +1 -0
- package/dist/providers/builders/radix.test.js.map +1 -1
- package/dist/providers/providerBuilders.d.ts +1 -1
- package/dist/providers/providerBuilders.d.ts.map +1 -1
- package/dist/providers/providerBuilders.js +1 -1
- package/dist/providers/providerBuilders.js.map +1 -1
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +60 -8
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
- package/dist/test/errors.d.ts +25 -0
- package/dist/test/errors.d.ts.map +1 -1
- package/dist/test/errors.js +31 -0
- package/dist/test/errors.js.map +1 -1
- package/dist/test/fixtures/warp-route-replay/record.d.ts +2 -0
- package/dist/test/fixtures/warp-route-replay/record.d.ts.map +1 -0
- package/dist/test/fixtures/warp-route-replay/record.js +32 -0
- package/dist/test/fixtures/warp-route-replay/record.js.map +1 -0
- package/dist/test/replayRpc.d.ts +82 -0
- package/dist/test/replayRpc.d.ts.map +1 -0
- package/dist/test/replayRpc.js +331 -0
- package/dist/test/replayRpc.js.map +1 -0
- package/dist/test/replayScenarios.d.ts +19 -0
- package/dist/test/replayScenarios.d.ts.map +1 -0
- package/dist/test/replayScenarios.js +89 -0
- package/dist/test/replayScenarios.js.map +1 -0
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +92 -7
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -1
- package/dist/timelock/evm/errors.js +1 -1
- package/dist/timelock/evm/errors.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.d.ts +27 -0
- package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
- package/dist/token/EvmWarpRouteReader.hardhat-test.js +28 -3
- package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.js +172 -42
- package/dist/token/EvmWarpRouteReader.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.replay.test.d.ts +2 -0
- package/dist/token/EvmWarpRouteReader.replay.test.d.ts.map +1 -0
- package/dist/token/EvmWarpRouteReader.replay.test.js +392 -0
- package/dist/token/EvmWarpRouteReader.replay.test.js.map +1 -0
- package/dist/token/EvmWarpRouteReader.test.js +529 -4
- package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
- package/dist/token/types.d.ts +1 -1
- package/dist/token/warpCheck.d.ts +1 -0
- package/dist/token/warpCheck.d.ts.map +1 -1
- package/dist/token/warpCheck.js +25 -2
- package/dist/token/warpCheck.js.map +1 -1
- package/dist/token/warpCheck.test.js +119 -0
- package/dist/token/warpCheck.test.js.map +1 -1
- package/dist/utils/contract.d.ts +33 -0
- package/dist/utils/contract.d.ts.map +1 -1
- package/dist/utils/contract.js +116 -3
- package/dist/utils/contract.js.map +1 -1
- package/dist/utils/contract.test.js +465 -2
- package/dist/utils/contract.test.js.map +1 -1
- package/dist/utils/contract.transport.test.d.ts +2 -0
- package/dist/utils/contract.transport.test.d.ts.map +1 -0
- package/dist/utils/contract.transport.test.js +145 -0
- package/dist/utils/contract.transport.test.js.map +1 -0
- package/dist/utils/ism.d.ts +12 -6
- package/dist/utils/ism.d.ts.map +1 -1
- package/dist/utils/ism.js +92 -41
- package/dist/utils/ism.js.map +1 -1
- package/dist/utils/ism.test.js +75 -2
- package/dist/utils/ism.test.js.map +1 -1
- package/package.json +29 -15
|
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAyB,SAAS,EAAS,MAAM,QAAQ,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAWpC,OAAO,EACL,aAAa,EAGb,MAAM,EACP,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EACL,wBAAwB,EAEzB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"SmartProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/SmartProvider/SmartProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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([
|
|
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
|
-
?
|
|
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), {
|
|
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
|
-
|
|
561
|
-
errors
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
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, {
|