@across-protocol/sdk 4.1.21 → 4.1.23

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 (115) hide show
  1. package/dist/cjs/addressAggregator/adapters/bybit.d.ts +10 -0
  2. package/dist/cjs/addressAggregator/adapters/bybit.js +42 -0
  3. package/dist/cjs/addressAggregator/adapters/bybit.js.map +1 -0
  4. package/dist/cjs/addressAggregator/adapters/env.d.ts +8 -0
  5. package/dist/cjs/addressAggregator/adapters/env.js +33 -0
  6. package/dist/cjs/addressAggregator/adapters/env.js.map +1 -0
  7. package/dist/cjs/addressAggregator/adapters/file.d.ts +8 -0
  8. package/dist/cjs/addressAggregator/adapters/file.js +50 -0
  9. package/dist/cjs/addressAggregator/adapters/file.js.map +1 -0
  10. package/dist/cjs/addressAggregator/adapters/index.d.ts +3 -0
  11. package/dist/cjs/addressAggregator/adapters/index.js +8 -0
  12. package/dist/cjs/addressAggregator/adapters/index.js.map +1 -0
  13. package/dist/cjs/addressAggregator/adapters/util.d.ts +4 -0
  14. package/dist/cjs/addressAggregator/adapters/util.js +66 -0
  15. package/dist/cjs/addressAggregator/adapters/util.js.map +1 -0
  16. package/dist/cjs/addressAggregator/index.d.ts +10 -0
  17. package/dist/cjs/addressAggregator/index.js +109 -0
  18. package/dist/cjs/addressAggregator/index.js.map +1 -0
  19. package/dist/cjs/addressAggregator/types.d.ts +6 -0
  20. package/dist/cjs/addressAggregator/types.js +5 -0
  21. package/dist/cjs/addressAggregator/types.js.map +1 -0
  22. package/dist/cjs/clients/SpokePoolClient.js +18 -12
  23. package/dist/cjs/clients/SpokePoolClient.js.map +1 -1
  24. package/dist/cjs/index.d.ts +1 -0
  25. package/dist/cjs/index.js +2 -1
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/utils/LogUtils.d.ts +4 -2
  28. package/dist/cjs/utils/LogUtils.js +10 -1
  29. package/dist/cjs/utils/LogUtils.js.map +1 -1
  30. package/dist/cjs/utils/Multicall.d.ts +4 -0
  31. package/dist/cjs/utils/Multicall.js +33 -4
  32. package/dist/cjs/utils/Multicall.js.map +1 -1
  33. package/dist/cjs/utils/NetworkUtils.d.ts +1 -0
  34. package/dist/cjs/utils/NetworkUtils.js +4 -3
  35. package/dist/cjs/utils/NetworkUtils.js.map +1 -1
  36. package/dist/cjs/utils/SpokeUtils.d.ts +1 -0
  37. package/dist/cjs/utils/SpokeUtils.js +52 -1
  38. package/dist/cjs/utils/SpokeUtils.js.map +1 -1
  39. package/dist/esm/addressAggregator/adapters/bybit.d.ts +10 -0
  40. package/dist/esm/addressAggregator/adapters/bybit.js +41 -0
  41. package/dist/esm/addressAggregator/adapters/bybit.js.map +1 -0
  42. package/dist/esm/addressAggregator/adapters/env.d.ts +8 -0
  43. package/dist/esm/addressAggregator/adapters/env.js +30 -0
  44. package/dist/esm/addressAggregator/adapters/env.js.map +1 -0
  45. package/dist/esm/addressAggregator/adapters/file.d.ts +8 -0
  46. package/dist/esm/addressAggregator/adapters/file.js +47 -0
  47. package/dist/esm/addressAggregator/adapters/file.js.map +1 -0
  48. package/dist/esm/addressAggregator/adapters/index.d.ts +3 -0
  49. package/dist/esm/addressAggregator/adapters/index.js +7 -0
  50. package/dist/esm/addressAggregator/adapters/index.js.map +1 -0
  51. package/dist/esm/addressAggregator/adapters/util.d.ts +4 -0
  52. package/dist/esm/addressAggregator/adapters/util.js +60 -0
  53. package/dist/esm/addressAggregator/adapters/util.js.map +1 -0
  54. package/dist/esm/addressAggregator/index.d.ts +10 -0
  55. package/dist/esm/addressAggregator/index.js +107 -0
  56. package/dist/esm/addressAggregator/index.js.map +1 -0
  57. package/dist/esm/addressAggregator/types.d.ts +6 -0
  58. package/dist/esm/addressAggregator/types.js +2 -0
  59. package/dist/esm/addressAggregator/types.js.map +1 -0
  60. package/dist/esm/clients/SpokePoolClient.js +19 -13
  61. package/dist/esm/clients/SpokePoolClient.js.map +1 -1
  62. package/dist/esm/index.d.ts +1 -0
  63. package/dist/esm/index.js +2 -0
  64. package/dist/esm/index.js.map +1 -1
  65. package/dist/esm/utils/LogUtils.d.ts +4 -2
  66. package/dist/esm/utils/LogUtils.js +10 -1
  67. package/dist/esm/utils/LogUtils.js.map +1 -1
  68. package/dist/esm/utils/Multicall.d.ts +4 -0
  69. package/dist/esm/utils/Multicall.js +33 -5
  70. package/dist/esm/utils/Multicall.js.map +1 -1
  71. package/dist/esm/utils/NetworkUtils.d.ts +1 -0
  72. package/dist/esm/utils/NetworkUtils.js +2 -1
  73. package/dist/esm/utils/NetworkUtils.js.map +1 -1
  74. package/dist/esm/utils/SpokeUtils.d.ts +1 -0
  75. package/dist/esm/utils/SpokeUtils.js +51 -0
  76. package/dist/esm/utils/SpokeUtils.js.map +1 -1
  77. package/dist/types/addressAggregator/adapters/bybit.d.ts +11 -0
  78. package/dist/types/addressAggregator/adapters/bybit.d.ts.map +1 -0
  79. package/dist/types/addressAggregator/adapters/env.d.ts +9 -0
  80. package/dist/types/addressAggregator/adapters/env.d.ts.map +1 -0
  81. package/dist/types/addressAggregator/adapters/file.d.ts +9 -0
  82. package/dist/types/addressAggregator/adapters/file.d.ts.map +1 -0
  83. package/dist/types/addressAggregator/adapters/index.d.ts +4 -0
  84. package/dist/types/addressAggregator/adapters/index.d.ts.map +1 -0
  85. package/dist/types/addressAggregator/adapters/util.d.ts +5 -0
  86. package/dist/types/addressAggregator/adapters/util.d.ts.map +1 -0
  87. package/dist/types/addressAggregator/index.d.ts +11 -0
  88. package/dist/types/addressAggregator/index.d.ts.map +1 -0
  89. package/dist/types/addressAggregator/types.d.ts +7 -0
  90. package/dist/types/addressAggregator/types.d.ts.map +1 -0
  91. package/dist/types/clients/SpokePoolClient.d.ts.map +1 -1
  92. package/dist/types/index.d.ts +1 -0
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/types/utils/LogUtils.d.ts +4 -2
  95. package/dist/types/utils/LogUtils.d.ts.map +1 -1
  96. package/dist/types/utils/Multicall.d.ts +4 -0
  97. package/dist/types/utils/Multicall.d.ts.map +1 -1
  98. package/dist/types/utils/NetworkUtils.d.ts +1 -0
  99. package/dist/types/utils/NetworkUtils.d.ts.map +1 -1
  100. package/dist/types/utils/SpokeUtils.d.ts +1 -0
  101. package/dist/types/utils/SpokeUtils.d.ts.map +1 -1
  102. package/package.json +4 -4
  103. package/src/addressAggregator/adapters/bybit.ts +32 -0
  104. package/src/addressAggregator/adapters/env.ts +30 -0
  105. package/src/addressAggregator/adapters/file.ts +39 -0
  106. package/src/addressAggregator/adapters/index.ts +3 -0
  107. package/src/addressAggregator/adapters/util.ts +47 -0
  108. package/src/addressAggregator/index.ts +86 -0
  109. package/src/addressAggregator/types.ts +8 -0
  110. package/src/clients/SpokePoolClient.ts +11 -18
  111. package/src/index.ts +1 -0
  112. package/src/utils/LogUtils.ts +3 -2
  113. package/src/utils/Multicall.ts +29 -1
  114. package/src/utils/NetworkUtils.ts +2 -1
  115. package/src/utils/SpokeUtils.ts +48 -1
@@ -1,5 +1,6 @@
1
- import { Logger } from "winston";
1
+ import winston from "winston";
2
2
 
3
+ export class Logger extends winston.Logger {}
3
4
  export type DefaultLogLevels = "debug" | "info" | "warn" | "error";
4
5
 
5
6
  type LogParamType = {
@@ -13,7 +14,7 @@ type LogParamType = {
13
14
  };
14
15
 
15
16
  export function formattedLog(
16
- logger: Logger | undefined,
17
+ logger: winston.Logger | undefined,
17
18
  { level, message, at: { location, function: fnName }, data }: LogParamType
18
19
  ): void {
19
20
  if (logger) {
@@ -1,6 +1,6 @@
1
1
  import { Contract, providers, Signer, utils as ethersUtils } from "ethers";
2
2
  import { CHAIN_IDs } from "@across-protocol/constants";
3
- import { chainIsOPStack } from "./NetworkUtils";
3
+ import { chainIsOPStack, hreNetworks } from "./NetworkUtils";
4
4
  import { BigNumber } from "./BigNumberUtils";
5
5
  import { Multicall3, Multicall3__factory } from "./abi/typechain";
6
6
 
@@ -35,6 +35,7 @@ const DETERMINISTIC_MULTICALL_CHAINS = [
35
35
  CHAIN_IDs.SCROLL_SEPOLIA,
36
36
  CHAIN_IDs.SEPOLIA,
37
37
  CHAIN_IDs.ARBITRUM_SEPOLIA,
38
+ ...Object.keys(hreNetworks).map(Number), // See test/utils/multicall.ts
38
39
  ];
39
40
 
40
41
  export function getMulticallAddress(chainId: number): string | undefined {
@@ -66,3 +67,30 @@ export async function aggregate(multicall3: Contract, calls: Call3[], blockTag?:
66
67
  return contract.interface.decodeFunctionResult(method, result);
67
68
  });
68
69
  }
70
+
71
+ export async function blockAndAggregate(
72
+ multicall3: Contract,
73
+ calls: Call3[],
74
+ blockTag?: BlockTag
75
+ ): Promise<{ blockNumber: number; returnData: Result[] }> {
76
+ const inputs = calls.map(({ contract, method, args }) => ({
77
+ target: contract.address,
78
+ callData: contract.interface.encodeFunctionData(method, args),
79
+ }));
80
+
81
+ type blockAndAggregateResponse = Promise<{
82
+ blockNumber: BigNumber;
83
+ blockHash: string;
84
+ returnData: Multicall3.ResultStructOutput[];
85
+ }>;
86
+ const { blockNumber, returnData: _returnData } = await (multicall3.callStatic.blockAndAggregate(inputs, {
87
+ blockTag,
88
+ }) as blockAndAggregateResponse);
89
+
90
+ const returnData = _returnData.map(({ returnData }, idx) => {
91
+ const { contract, method } = calls[idx];
92
+ return contract.interface.decodeFunctionResult(method, returnData);
93
+ });
94
+
95
+ return { blockNumber: blockNumber.toNumber(), returnData };
96
+ }
@@ -1,8 +1,9 @@
1
1
  import { ChainFamily, CHAIN_IDs, MAINNET_CHAIN_IDs, PUBLIC_NETWORKS, TESTNET_CHAIN_IDs } from "../constants";
2
2
 
3
- const hreNetworks: Record<number, string> = {
3
+ export const hreNetworks: Record<number, string> = {
4
4
  666: "Hardhat1",
5
5
  1337: "Hardhat2",
6
+ 31337: "HardhatNetwork",
6
7
  };
7
8
 
8
9
  /**
@@ -7,6 +7,7 @@ import { chunk } from "./ArrayUtils";
7
7
  import { BigNumber, toBN, bnOne, bnZero } from "./BigNumberUtils";
8
8
  import { keccak256 } from "./common";
9
9
  import { isMessageEmpty } from "./DepositUtils";
10
+ import { blockAndAggregate, getMulticall3 } from "./Multicall";
10
11
  import { isDefined } from "./TypeGuards";
11
12
  import { getNetworkName } from "./NetworkUtils";
12
13
  import { paginatedEventQuery, spreadEventWithBlockNumber } from "./EventUtils";
@@ -333,6 +334,52 @@ export function getRelayHashFromEvent(e: RelayData & { destinationChainId: numbe
333
334
  return getRelayDataHash(e, e.destinationChainId);
334
335
  }
335
336
 
337
+ export async function findDepositBlock(
338
+ spokePool: Contract,
339
+ depositId: BigNumber,
340
+ lowBlock: number,
341
+ highBlock?: number
342
+ ): Promise<number | undefined> {
343
+ // We can only perform this search when we have a safe deposit ID.
344
+ if (isUnsafeDepositId(depositId)) {
345
+ throw new Error(`Cannot binary search for depositId ${depositId}`);
346
+ }
347
+
348
+ // @todo this call can be optimised away by using multicall3.blockAndAggregate(..., { blockTag: highBlockNumber }).
349
+ // This is left for future because the change is a bit complex, and multicall3 isn't supported in test.
350
+ const { chainId } = await spokePool.provider.getNetwork();
351
+ const multicall3 = getMulticall3(chainId, spokePool.provider);
352
+ assert(multicall3, `No multicall3 defined for chain ${chainId}`);
353
+
354
+ // Make sure the deposit occurred within the block range supplied by the caller.
355
+ const [_nDepositsLow, { blockNumber: _highBlock, returnData }] = await Promise.all([
356
+ spokePool.numberOfDeposits({ blockTag: lowBlock }),
357
+ blockAndAggregate(multicall3, [{ contract: spokePool, method: "numberOfDeposits" }], highBlock),
358
+ ]);
359
+ highBlock = _highBlock;
360
+ assert(highBlock > lowBlock, `Block numbers out of range (${lowBlock} >= ${highBlock})`);
361
+
362
+ const nDepositsLow = toBN(_nDepositsLow);
363
+ const nDepositsHigh = toBN(returnData.at(0)!);
364
+ if (nDepositsLow.gt(depositId) || nDepositsHigh.lte(depositId)) {
365
+ return undefined; // Deposit did not occur within the specified block range.
366
+ }
367
+
368
+ // Find the lowest block number where numberOfDeposits is greater than the requested depositId.
369
+ do {
370
+ const midBlock = Math.floor((highBlock + lowBlock) / 2);
371
+ const nDeposits = toBN(await spokePool.numberOfDeposits({ blockTag: midBlock }));
372
+
373
+ if (nDeposits.gt(depositId)) {
374
+ highBlock = midBlock; // depositId occurred at or earlier than midBlock.
375
+ } else {
376
+ lowBlock = midBlock + 1; // depositId occurred later than midBlock.
377
+ }
378
+ } while (lowBlock < highBlock);
379
+
380
+ return lowBlock;
381
+ }
382
+
336
383
  export function isUnsafeDepositId(depositId: BigNumber): boolean {
337
384
  // SpokePool.unsafeDepositV3() produces a uint256 depositId by hashing the msg.sender, depositor and input
338
385
  // uint256 depositNonce. There is a possibility that this resultant uint256 is less than the maxSafeDepositId (i.e.
@@ -439,7 +486,7 @@ export async function findFillBlock(
439
486
  `Origin & destination chain IDs must not be equal (${destinationChainId})`
440
487
  );
441
488
 
442
- // Make sure the relay war completed within the block range supplied by the caller.
489
+ // Make sure the relay was completed within the block range supplied by the caller.
443
490
  const [initialFillStatus, finalFillStatus] = (
444
491
  await Promise.all([
445
492
  relayFillStatus(spokePool, relayData, lowBlockNumber, destinationChainId),