@across-protocol/sdk 4.1.25-beta.1 → 4.1.26

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 (37) hide show
  1. package/dist/cjs/clients/SpokePoolClient.d.ts +2 -8
  2. package/dist/cjs/clients/SpokePoolClient.js +25 -44
  3. package/dist/cjs/clients/SpokePoolClient.js.map +1 -1
  4. package/dist/cjs/clients/mocks/MockSpokePoolClient.js +0 -5
  5. package/dist/cjs/clients/mocks/MockSpokePoolClient.js.map +1 -1
  6. package/dist/cjs/providers/solana/cachedRpcFactory.js +23 -8
  7. package/dist/cjs/providers/solana/cachedRpcFactory.js.map +1 -1
  8. package/dist/cjs/utils/DepositUtils.js +16 -27
  9. package/dist/cjs/utils/DepositUtils.js.map +1 -1
  10. package/dist/cjs/utils/Multicall.d.ts +1 -0
  11. package/dist/cjs/utils/Multicall.js +55 -1
  12. package/dist/cjs/utils/Multicall.js.map +1 -1
  13. package/dist/esm/clients/SpokePoolClient.d.ts +8 -8
  14. package/dist/esm/clients/SpokePoolClient.js +32 -45
  15. package/dist/esm/clients/SpokePoolClient.js.map +1 -1
  16. package/dist/esm/clients/mocks/MockSpokePoolClient.js +1 -7
  17. package/dist/esm/clients/mocks/MockSpokePoolClient.js.map +1 -1
  18. package/dist/esm/providers/solana/cachedRpcFactory.js +24 -8
  19. package/dist/esm/providers/solana/cachedRpcFactory.js.map +1 -1
  20. package/dist/esm/utils/DepositUtils.js +16 -27
  21. package/dist/esm/utils/DepositUtils.js.map +1 -1
  22. package/dist/esm/utils/Multicall.d.ts +6 -0
  23. package/dist/esm/utils/Multicall.js +60 -1
  24. package/dist/esm/utils/Multicall.js.map +1 -1
  25. package/dist/types/clients/SpokePoolClient.d.ts +8 -8
  26. package/dist/types/clients/SpokePoolClient.d.ts.map +1 -1
  27. package/dist/types/clients/mocks/MockSpokePoolClient.d.ts.map +1 -1
  28. package/dist/types/providers/solana/cachedRpcFactory.d.ts.map +1 -1
  29. package/dist/types/utils/DepositUtils.d.ts.map +1 -1
  30. package/dist/types/utils/Multicall.d.ts +6 -0
  31. package/dist/types/utils/Multicall.d.ts.map +1 -1
  32. package/package.json +1 -1
  33. package/src/clients/SpokePoolClient.ts +29 -45
  34. package/src/clients/mocks/MockSpokePoolClient.ts +0 -10
  35. package/src/providers/solana/cachedRpcFactory.ts +28 -14
  36. package/src/utils/DepositUtils.ts +18 -29
  37. package/src/utils/Multicall.ts +34 -1
@@ -60,40 +60,23 @@ export async function queryHistoricalDepositForFill(
60
60
  }
61
61
 
62
62
  const { depositId } = fill;
63
- let { firstDepositIdForSpokePool: lowId, lastDepositIdForSpokePool: highId } = spokePoolClient;
64
- if (depositId.lt(lowId) || depositId.gt(highId)) {
65
- return {
66
- found: false,
67
- code: InvalidFill.DepositIdInvalid,
68
- reason: `Deposit ID ${depositId.toString()} is outside of SpokePool bounds [${lowId},${highId}].`,
69
- };
70
- }
71
-
72
- ({ earliestDepositIdQueried: lowId, latestDepositIdQueried: highId } = spokePoolClient);
73
- if (depositId.gte(lowId) && depositId.lte(highId)) {
74
- const originChain = getNetworkName(fill.originChainId);
75
- const deposit = spokePoolClient.getDeposit(depositId);
76
- if (isDefined(deposit)) {
77
- const match = validateFillForDeposit(fill, deposit);
78
- if (match.valid) {
79
- return { found: true, deposit };
80
- }
81
-
82
- return {
83
- found: false,
84
- code: InvalidFill.FillMismatch,
85
- reason: `Fill for ${originChain} deposit ID ${depositId.toString()} is invalid (${match.reason}).`,
86
- };
63
+ const originChain = getNetworkName(fill.originChainId);
64
+ let deposit = spokePoolClient.getDeposit(depositId);
65
+ if (isDefined(deposit)) {
66
+ const match = validateFillForDeposit(fill, deposit);
67
+ if (match.valid) {
68
+ return { found: true, deposit };
87
69
  }
88
70
 
89
71
  return {
90
72
  found: false,
91
- code: InvalidFill.DepositIdNotFound,
92
- reason: `${originChain} deposit ID ${depositId.toString()} not found in SpokePoolClient event buffer.`,
73
+ code: InvalidFill.FillMismatch,
74
+ reason: `Fill for ${originChain} deposit ID ${depositId.toString()} is invalid (${match.reason}).`,
93
75
  };
94
76
  }
95
77
 
96
- let deposit: DepositWithBlock, cachedDeposit: Deposit | undefined;
78
+ // Deposit not found in SpokePoolClient buffer, search elsewhere.
79
+ let cachedDeposit: Deposit | undefined;
97
80
  if (cache) {
98
81
  cachedDeposit = await getDepositInCache(getDepositKey(fill), cache);
99
82
  // We only want to warn and remove the cached deposit if it
@@ -116,17 +99,23 @@ export async function queryHistoricalDepositForFill(
116
99
  if (isDefined(cachedDeposit)) {
117
100
  deposit = cachedDeposit as DepositWithBlock;
118
101
  } else {
119
- deposit = await spokePoolClient.findDeposit(fill.depositId, fill.destinationChainId);
102
+ const result = await spokePoolClient.findDeposit(fill.depositId);
103
+ if (!result.found) {
104
+ return result;
105
+ }
106
+
107
+ ({ deposit } = result);
120
108
  if (cache) {
121
109
  await setDepositInCache(deposit, getCurrentTime(), cache, DEFAULT_CACHING_TTL);
122
110
  }
123
111
  }
112
+ assert(isDefined(deposit), `Unexpectedly failed to locate ${originChain} deposit ${fill.depositId}`);
124
113
 
125
114
  deposit.messageHash ??= getMessageHash(deposit.message);
126
115
 
127
116
  const match = validateFillForDeposit(fill, deposit);
128
117
  if (match.valid) {
129
- return { found: true, deposit };
118
+ return { found: true, deposit: deposit! };
130
119
  }
131
120
 
132
121
  return {
@@ -1,5 +1,6 @@
1
+ import assert from "assert";
1
2
  import { Contract, providers, Signer, utils as ethersUtils } from "ethers";
2
- import { CHAIN_IDs } from "@across-protocol/constants";
3
+ import { CHAIN_IDs, MAINNET_CHAIN_IDs } from "@across-protocol/constants";
3
4
  import { chainIsOPStack, hreNetworks } from "./NetworkUtils";
4
5
  import { BigNumber } from "./BigNumberUtils";
5
6
  import { Multicall3, Multicall3__factory } from "./abi/typechain";
@@ -16,6 +17,7 @@ export type Call3 = {
16
17
  };
17
18
 
18
19
  const DETERMINISTIC_MULTICALL_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
20
+ const MULTICALL_DEPLOYER = "0x05f32B3cC3888453ff71B01135B34FF8e41263F2";
19
21
 
20
22
  const NON_DETERMINISTIC_MULTICALL_ADDRESSES = {
21
23
  [CHAIN_IDs.ZK_SYNC]: "0xF9cda624FBC7e059355ce98a31693d299FACd963",
@@ -94,3 +96,34 @@ export async function blockAndAggregate(
94
96
 
95
97
  return { blockNumber: blockNumber.toNumber(), returnData };
96
98
  }
99
+
100
+ async function isDeployed(provider: providers.Provider): Promise<boolean> {
101
+ const { chainId } = await provider.getNetwork();
102
+ const expectedMulticallAddress = getMulticallAddress(chainId) ?? DETERMINISTIC_MULTICALL_ADDRESS;
103
+ const code = await provider.getCode(expectedMulticallAddress);
104
+ return code !== "0x";
105
+ }
106
+
107
+ /**
108
+ * Deploy a Multicall3 instance.
109
+ * Guidance: https://github.com/mds1/multicall3?tab=readme-ov-file#new-deployments
110
+ * @param signer An Ethers Signer instance with at least 0.1 ETH.
111
+ */
112
+ export async function deploy(signer: Signer) {
113
+ assert(signer.provider);
114
+ if (await isDeployed(signer.provider)) {
115
+ return true;
116
+ }
117
+ const { chainId } = await signer.provider.getNetwork();
118
+ assert(!Object.values(MAINNET_CHAIN_IDs).includes(chainId));
119
+
120
+ await signer.sendTransaction({ to: MULTICALL_DEPLOYER, value: ethersUtils.parseEther("0.1") }); // Pre-fund the deployer address.
121
+ await signer.provider.sendTransaction(MULTICALL_CALLDATA); // Deploy
122
+
123
+ assert(await isDeployed(signer.provider));
124
+ return true;
125
+ }
126
+
127
+ // Multicall3 deployment transaction, pre-signed `deployer`.
128
+ const MULTICALL_CALLDATA =
129
+ "0xf90f538085174876e800830f42408080b90f00608060405234801561001057600080fd5b50610ee0806100206000396000f3fe6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c00331ca0edce47092c0f398cebf3ffc267f05c8e7076e3b89445e0fe50f6332273d4569ba01b0b9d000e19b24c5869b0fc3b22b0d6fa47cd63316875cbbd577d76e6fde086";