@across-protocol/sdk 4.2.13 → 4.2.14-alpha.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 (194) hide show
  1. package/dist/cjs/arch/evm/SpokeUtils.d.ts +5 -2
  2. package/dist/cjs/arch/evm/SpokeUtils.js +22 -5
  3. package/dist/cjs/arch/evm/SpokeUtils.js.map +1 -1
  4. package/dist/cjs/arch/svm/SpokeUtils.js +14 -11
  5. package/dist/cjs/arch/svm/SpokeUtils.js.map +1 -1
  6. package/dist/cjs/arch/svm/utils.d.ts +1 -1
  7. package/dist/cjs/arch/svm/utils.js +15 -13
  8. package/dist/cjs/arch/svm/utils.js.map +1 -1
  9. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +3 -3
  10. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +4 -2
  11. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
  12. package/dist/cjs/clients/BundleDataClient/BundleDataClient.d.ts +4 -4
  13. package/dist/cjs/clients/BundleDataClient/BundleDataClient.js +60 -56
  14. package/dist/cjs/clients/BundleDataClient/BundleDataClient.js.map +1 -1
  15. package/dist/cjs/clients/BundleDataClient/utils/DataworkerUtils.js +13 -13
  16. package/dist/cjs/clients/BundleDataClient/utils/DataworkerUtils.js.map +1 -1
  17. package/dist/cjs/clients/BundleDataClient/utils/FillUtils.d.ts +2 -1
  18. package/dist/cjs/clients/BundleDataClient/utils/FillUtils.js +3 -2
  19. package/dist/cjs/clients/BundleDataClient/utils/FillUtils.js.map +1 -1
  20. package/dist/cjs/clients/BundleDataClient/utils/MerkleTreeUtils.js +5 -1
  21. package/dist/cjs/clients/BundleDataClient/utils/MerkleTreeUtils.js.map +1 -1
  22. package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js +3 -3
  23. package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
  24. package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.d.ts +63 -63
  25. package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.js +11 -8
  26. package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.js.map +1 -1
  27. package/dist/cjs/clients/HubPoolClient.d.ts +21 -21
  28. package/dist/cjs/clients/HubPoolClient.js +84 -60
  29. package/dist/cjs/clients/HubPoolClient.js.map +1 -1
  30. package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js +1 -1
  31. package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  32. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.d.ts +2 -2
  33. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js +52 -37
  34. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
  35. package/dist/cjs/clients/mocks/MockHubPoolClient.d.ts +9 -9
  36. package/dist/cjs/clients/mocks/MockHubPoolClient.js +15 -9
  37. package/dist/cjs/clients/mocks/MockHubPoolClient.js.map +1 -1
  38. package/dist/cjs/clients/mocks/MockSpokePoolClient.d.ts +5 -3
  39. package/dist/cjs/clients/mocks/MockSpokePoolClient.js +39 -36
  40. package/dist/cjs/clients/mocks/MockSpokePoolClient.js.map +1 -1
  41. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.d.ts +2 -2
  42. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js +2 -2
  43. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js.map +1 -1
  44. package/dist/cjs/interfaces/HubPool.d.ts +19 -14
  45. package/dist/cjs/interfaces/SpokePool.d.ts +13 -13
  46. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.d.ts +6 -6
  47. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js +7 -7
  48. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
  49. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.d.ts +4 -4
  50. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js +14 -15
  51. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
  52. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.d.ts +5 -5
  53. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js +7 -7
  54. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
  55. package/dist/cjs/utils/AddressUtils.d.ts +6 -3
  56. package/dist/cjs/utils/AddressUtils.js +42 -14
  57. package/dist/cjs/utils/AddressUtils.js.map +1 -1
  58. package/dist/cjs/utils/SpokeUtils.d.ts +3 -3
  59. package/dist/cjs/utils/SpokeUtils.js +4 -22
  60. package/dist/cjs/utils/SpokeUtils.js.map +1 -1
  61. package/dist/cjs/utils/TokenUtils.d.ts +4 -4
  62. package/dist/cjs/utils/TokenUtils.js +3 -3
  63. package/dist/cjs/utils/TokenUtils.js.map +1 -1
  64. package/dist/esm/arch/evm/SpokeUtils.d.ts +5 -2
  65. package/dist/esm/arch/evm/SpokeUtils.js +23 -6
  66. package/dist/esm/arch/evm/SpokeUtils.js.map +1 -1
  67. package/dist/esm/arch/svm/SpokeUtils.js +15 -12
  68. package/dist/esm/arch/svm/SpokeUtils.js.map +1 -1
  69. package/dist/esm/arch/svm/utils.d.ts +1 -1
  70. package/dist/esm/arch/svm/utils.js +15 -13
  71. package/dist/esm/arch/svm/utils.js.map +1 -1
  72. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +3 -3
  73. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +4 -2
  74. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
  75. package/dist/esm/clients/BundleDataClient/BundleDataClient.d.ts +4 -4
  76. package/dist/esm/clients/BundleDataClient/BundleDataClient.js +61 -57
  77. package/dist/esm/clients/BundleDataClient/BundleDataClient.js.map +1 -1
  78. package/dist/esm/clients/BundleDataClient/utils/DataworkerUtils.js +14 -14
  79. package/dist/esm/clients/BundleDataClient/utils/DataworkerUtils.js.map +1 -1
  80. package/dist/esm/clients/BundleDataClient/utils/FillUtils.d.ts +2 -1
  81. package/dist/esm/clients/BundleDataClient/utils/FillUtils.js +4 -3
  82. package/dist/esm/clients/BundleDataClient/utils/FillUtils.js.map +1 -1
  83. package/dist/esm/clients/BundleDataClient/utils/MerkleTreeUtils.js +5 -1
  84. package/dist/esm/clients/BundleDataClient/utils/MerkleTreeUtils.js.map +1 -1
  85. package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js +4 -4
  86. package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
  87. package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.d.ts +63 -63
  88. package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.js +12 -9
  89. package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.js.map +1 -1
  90. package/dist/esm/clients/HubPoolClient.d.ts +23 -22
  91. package/dist/esm/clients/HubPoolClient.js +97 -64
  92. package/dist/esm/clients/HubPoolClient.js.map +1 -1
  93. package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js +2 -2
  94. package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  95. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.d.ts +2 -2
  96. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js +54 -38
  97. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
  98. package/dist/esm/clients/mocks/MockHubPoolClient.d.ts +9 -9
  99. package/dist/esm/clients/mocks/MockHubPoolClient.js +16 -10
  100. package/dist/esm/clients/mocks/MockHubPoolClient.js.map +1 -1
  101. package/dist/esm/clients/mocks/MockSpokePoolClient.d.ts +5 -3
  102. package/dist/esm/clients/mocks/MockSpokePoolClient.js +41 -38
  103. package/dist/esm/clients/mocks/MockSpokePoolClient.js.map +1 -1
  104. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.d.ts +2 -2
  105. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js +3 -3
  106. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js.map +1 -1
  107. package/dist/esm/interfaces/HubPool.d.ts +19 -14
  108. package/dist/esm/interfaces/SpokePool.d.ts +13 -13
  109. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.d.ts +6 -6
  110. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js +8 -8
  111. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
  112. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.d.ts +4 -4
  113. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js +15 -16
  114. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
  115. package/dist/esm/relayFeeCalculator/relayFeeCalculator.d.ts +5 -5
  116. package/dist/esm/relayFeeCalculator/relayFeeCalculator.js +8 -8
  117. package/dist/esm/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
  118. package/dist/esm/utils/AddressUtils.d.ts +7 -3
  119. package/dist/esm/utils/AddressUtils.js +52 -19
  120. package/dist/esm/utils/AddressUtils.js.map +1 -1
  121. package/dist/esm/utils/SpokeUtils.d.ts +3 -8
  122. package/dist/esm/utils/SpokeUtils.js +4 -26
  123. package/dist/esm/utils/SpokeUtils.js.map +1 -1
  124. package/dist/esm/utils/TokenUtils.d.ts +18 -16
  125. package/dist/esm/utils/TokenUtils.js +3 -3
  126. package/dist/esm/utils/TokenUtils.js.map +1 -1
  127. package/dist/types/arch/evm/SpokeUtils.d.ts +5 -2
  128. package/dist/types/arch/evm/SpokeUtils.d.ts.map +1 -1
  129. package/dist/types/arch/svm/SpokeUtils.d.ts.map +1 -1
  130. package/dist/types/arch/svm/utils.d.ts +1 -1
  131. package/dist/types/arch/svm/utils.d.ts.map +1 -1
  132. package/dist/types/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +3 -3
  133. package/dist/types/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts.map +1 -1
  134. package/dist/types/clients/BundleDataClient/BundleDataClient.d.ts +4 -4
  135. package/dist/types/clients/BundleDataClient/BundleDataClient.d.ts.map +1 -1
  136. package/dist/types/clients/BundleDataClient/utils/DataworkerUtils.d.ts.map +1 -1
  137. package/dist/types/clients/BundleDataClient/utils/FillUtils.d.ts +2 -1
  138. package/dist/types/clients/BundleDataClient/utils/FillUtils.d.ts.map +1 -1
  139. package/dist/types/clients/BundleDataClient/utils/MerkleTreeUtils.d.ts.map +1 -1
  140. package/dist/types/clients/BundleDataClient/utils/PoolRebalanceUtils.d.ts.map +1 -1
  141. package/dist/types/clients/BundleDataClient/utils/SuperstructUtils.d.ts +63 -63
  142. package/dist/types/clients/BundleDataClient/utils/SuperstructUtils.d.ts.map +1 -1
  143. package/dist/types/clients/HubPoolClient.d.ts +23 -22
  144. package/dist/types/clients/HubPoolClient.d.ts.map +1 -1
  145. package/dist/types/clients/SpokePoolClient/EVMSpokePoolClient.d.ts.map +1 -1
  146. package/dist/types/clients/SpokePoolClient/SpokePoolClient.d.ts +2 -2
  147. package/dist/types/clients/SpokePoolClient/SpokePoolClient.d.ts.map +1 -1
  148. package/dist/types/clients/mocks/MockHubPoolClient.d.ts +9 -9
  149. package/dist/types/clients/mocks/MockHubPoolClient.d.ts.map +1 -1
  150. package/dist/types/clients/mocks/MockSpokePoolClient.d.ts +5 -3
  151. package/dist/types/clients/mocks/MockSpokePoolClient.d.ts.map +1 -1
  152. package/dist/types/clients/mocks/MockSvmSpokePoolClient.d.ts +2 -2
  153. package/dist/types/clients/mocks/MockSvmSpokePoolClient.d.ts.map +1 -1
  154. package/dist/types/interfaces/HubPool.d.ts +19 -14
  155. package/dist/types/interfaces/HubPool.d.ts.map +1 -1
  156. package/dist/types/interfaces/SpokePool.d.ts +13 -13
  157. package/dist/types/interfaces/SpokePool.d.ts.map +1 -1
  158. package/dist/types/relayFeeCalculator/chain-queries/baseQuery.d.ts +6 -6
  159. package/dist/types/relayFeeCalculator/chain-queries/baseQuery.d.ts.map +1 -1
  160. package/dist/types/relayFeeCalculator/chain-queries/svmQuery.d.ts +4 -4
  161. package/dist/types/relayFeeCalculator/chain-queries/svmQuery.d.ts.map +1 -1
  162. package/dist/types/relayFeeCalculator/relayFeeCalculator.d.ts +5 -5
  163. package/dist/types/relayFeeCalculator/relayFeeCalculator.d.ts.map +1 -1
  164. package/dist/types/utils/AddressUtils.d.ts +7 -3
  165. package/dist/types/utils/AddressUtils.d.ts.map +1 -1
  166. package/dist/types/utils/SpokeUtils.d.ts +3 -8
  167. package/dist/types/utils/SpokeUtils.d.ts.map +1 -1
  168. package/dist/types/utils/TokenUtils.d.ts +18 -16
  169. package/dist/types/utils/TokenUtils.d.ts.map +1 -1
  170. package/package.json +2 -3
  171. package/src/arch/evm/SpokeUtils.ts +53 -11
  172. package/src/arch/svm/SpokeUtils.ts +44 -11
  173. package/src/arch/svm/utils.ts +3 -3
  174. package/src/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.ts +7 -4
  175. package/src/clients/BundleDataClient/BundleDataClient.ts +54 -52
  176. package/src/clients/BundleDataClient/utils/DataworkerUtils.ts +28 -13
  177. package/src/clients/BundleDataClient/utils/FillUtils.ts +6 -4
  178. package/src/clients/BundleDataClient/utils/MerkleTreeUtils.ts +7 -1
  179. package/src/clients/BundleDataClient/utils/PoolRebalanceUtils.ts +4 -4
  180. package/src/clients/BundleDataClient/utils/SuperstructUtils.ts +13 -9
  181. package/src/clients/HubPoolClient.ts +126 -83
  182. package/src/clients/SpokePoolClient/EVMSpokePoolClient.ts +6 -0
  183. package/src/clients/SpokePoolClient/SpokePoolClient.ts +109 -28
  184. package/src/clients/mocks/MockHubPoolClient.ts +24 -19
  185. package/src/clients/mocks/MockSpokePoolClient.ts +37 -26
  186. package/src/clients/mocks/MockSvmSpokePoolClient.ts +12 -3
  187. package/src/interfaces/HubPool.ts +23 -14
  188. package/src/interfaces/SpokePool.ts +13 -13
  189. package/src/relayFeeCalculator/chain-queries/baseQuery.ts +10 -8
  190. package/src/relayFeeCalculator/chain-queries/svmQuery.ts +16 -21
  191. package/src/relayFeeCalculator/relayFeeCalculator.ts +20 -12
  192. package/src/utils/AddressUtils.ts +56 -21
  193. package/src/utils/SpokeUtils.ts +11 -33
  194. package/src/utils/TokenUtils.ts +7 -7
@@ -1,8 +1,9 @@
1
1
  import assert from "assert";
2
2
  import { BytesLike, Contract, PopulatedTransaction, providers } from "ethers";
3
3
  import { CHAIN_IDs } from "../../constants";
4
- import { Deposit, FillStatus, FillWithBlock, RelayData } from "../../interfaces";
4
+ import { Deposit, FillStatus, FillWithBlock, RelayData, RelayExecutionEventInfo } from "../../interfaces";
5
5
  import {
6
+ EvmAddress,
6
7
  bnUint32Max,
7
8
  BigNumber,
8
9
  toBN,
@@ -13,11 +14,11 @@ import {
13
14
  isDefined,
14
15
  isUnsafeDepositId,
15
16
  isZeroAddress,
16
- getDepositRelayData,
17
17
  getNetworkName,
18
18
  paginatedEventQuery,
19
19
  spreadEventWithBlockNumber,
20
- toBytes32,
20
+ Address,
21
+ toAddressType,
21
22
  } from "../../utils";
22
23
 
23
24
  type BlockTag = providers.BlockTag;
@@ -30,11 +31,31 @@ type BlockTag = providers.BlockTag;
30
31
  */
31
32
  export function populateV3Relay(
32
33
  spokePool: Contract,
33
- deposit: Omit<Deposit, "messageHash">,
34
- relayer: string,
34
+ deposit: Omit<Deposit, "messageHash" | "fromLiteChain" | "toLiteChain"> & {
35
+ recipient: EvmAddress;
36
+ exclusiveRelayer: EvmAddress;
37
+ },
38
+ relayer: Address,
35
39
  repaymentChainId = deposit.destinationChainId
36
40
  ): Promise<PopulatedTransaction> {
37
- const relayData = getDepositRelayData(deposit);
41
+ assert(
42
+ relayer.isValidOn(repaymentChainId),
43
+ `Invalid repayment address for chain ${repaymentChainId}: ${relayer.toAddress()}.`
44
+ );
45
+ const relayData = {
46
+ depositor: deposit.depositor.toBytes32(),
47
+ recipient: deposit.recipient.toBytes32(),
48
+ inputToken: deposit.inputToken.toBytes32(),
49
+ outputToken: deposit.outputToken.toBytes32(),
50
+ inputAmount: deposit.inputAmount,
51
+ outputAmount: deposit.outputAmount,
52
+ originChainId: deposit.originChainId,
53
+ depositId: deposit.depositId,
54
+ fillDeadline: deposit.fillDeadline,
55
+ exclusivityDeadline: deposit.exclusivityDeadline,
56
+ message: deposit.message,
57
+ exclusiveRelayer: deposit.exclusiveRelayer.toBytes32(),
58
+ };
38
59
 
39
60
  if (isDefined(deposit.speedUpSignature)) {
40
61
  assert(isDefined(deposit.updatedRecipient) && !isZeroAddress(deposit.updatedRecipient));
@@ -43,16 +64,18 @@ export function populateV3Relay(
43
64
  return spokePool.populateTransaction.fillRelayWithUpdatedDeposit(
44
65
  relayData,
45
66
  repaymentChainId,
46
- toBytes32(relayer),
67
+ relayer.toBytes32(),
47
68
  deposit.updatedOutputAmount,
48
- toBytes32(deposit.updatedRecipient),
69
+ deposit.updatedRecipient.toBytes32(),
49
70
  deposit.updatedMessage,
50
71
  deposit.speedUpSignature,
51
- { from: relayer }
72
+ { from: relayer.toAddress() }
52
73
  );
53
74
  }
54
75
 
55
- return spokePool.populateTransaction.fillRelay(relayData, repaymentChainId, toBytes32(relayer), { from: relayer });
76
+ return spokePool.populateTransaction.fillRelay(relayData, repaymentChainId, relayer.toBytes32(), {
77
+ from: relayer.toAddress(),
78
+ });
56
79
  }
57
80
 
58
81
  /**
@@ -315,8 +338,27 @@ export async function findFillEvent(
315
338
  const destinationChainId = Object.values(CHAIN_IDs).includes(relayData.originChainId)
316
339
  ? (await spokePool.provider.getNetwork()).chainId
317
340
  : Number(await spokePool.chainId());
341
+ const fillEvent = spreadEventWithBlockNumber(event) as FillWithBlock & {
342
+ depositor: string;
343
+ recipient: string;
344
+ inputToken: string;
345
+ outputToken: string;
346
+ exclusiveRelayer: string;
347
+ relayer: string;
348
+ relayExecutionInfo: RelayExecutionEventInfo & { updatedRecipient: string };
349
+ };
318
350
  const fill = {
319
- ...spreadEventWithBlockNumber(event),
351
+ ...fillEvent,
352
+ inputToken: toAddressType(fillEvent.inputToken, relayData.originChainId),
353
+ outputToken: toAddressType(fillEvent.outputToken, destinationChainId),
354
+ depositor: toAddressType(fillEvent.depositor, relayData.originChainId),
355
+ recipient: toAddressType(fillEvent.recipient, destinationChainId),
356
+ exclusiveRelayer: toAddressType(fillEvent.exclusiveRelayer, destinationChainId),
357
+ relayer: toAddressType(fillEvent.relayer, destinationChainId),
358
+ relayExecutionInfo: {
359
+ ...fillEvent.relayExecutionInfo,
360
+ updatedRecipient: toAddressType(fillEvent.relayExecutionInfo.updatedRecipient, destinationChainId),
361
+ },
320
362
  destinationChainId,
321
363
  messageHash: getMessageHash(event.args.message),
322
364
  } as FillWithBlock;
@@ -27,7 +27,14 @@ import { arrayify, hexZeroPad, hexlify } from "ethers/lib/utils";
27
27
  import { Logger } from "winston";
28
28
 
29
29
  import { SYSTEM_PROGRAM_ADDRESS } from "@solana-program/system";
30
- import { Deposit, DepositWithBlock, FillStatus, FillWithBlock, RelayData } from "../../interfaces";
30
+ import {
31
+ Deposit,
32
+ DepositWithBlock,
33
+ FillStatus,
34
+ FillWithBlock,
35
+ RelayData,
36
+ RelayExecutionEventInfo,
37
+ } from "../../interfaces";
31
38
  import { BigNumber, SvmAddress, chainIsSvm, chunk, isUnsafeDepositId, keccak256, toAddressType } from "../../utils";
32
39
  import {
33
40
  SvmCpiEventsClient,
@@ -136,13 +143,19 @@ export async function findDeposit(
136
143
  return undefined;
137
144
  }
138
145
 
146
+ const unwrappedDepositEvent = unwrapEventData(depositEvent.data) as Record<string, unknown>;
139
147
  // Return the deposit event with block info
140
148
  return {
141
149
  txnRef: depositEvent.signature.toString(),
142
150
  blockNumber: Number(depositEvent.slot),
143
151
  txnIndex: 0,
144
152
  logIndex: 0,
145
- ...(unwrapEventData(depositEvent.data) as Record<string, unknown>),
153
+ ...unwrappedDepositEvent,
154
+ depositor: toAddressType(unwrappedDepositEvent.depositor as string),
155
+ recipient: toAddressType(unwrappedDepositEvent.recipient as string),
156
+ inputToken: toAddressType(unwrappedDepositEvent.inputToken as string),
157
+ outputToken: toAddressType(unwrappedDepositEvent.outputToken as string),
158
+ exclusiveRelayer: toAddressType(unwrappedDepositEvent.exclusiveRelayer as string),
146
159
  } as DepositWithBlock;
147
160
  }
148
161
 
@@ -318,14 +331,34 @@ export async function findFillEvent(
318
331
 
319
332
  if (fillEvents.length > 0) {
320
333
  const rawFillEvent = fillEvents[0];
334
+ const eventData = unwrapEventData(rawFillEvent.data) as FillWithBlock & {
335
+ depositor: string;
336
+ recipient: string;
337
+ inputToken: string;
338
+ outputToken: string;
339
+ exclusiveRelayer: string;
340
+ relayer: string;
341
+ relayExecutionInfo: RelayExecutionEventInfo & { updatedRecipient: string };
342
+ };
343
+ const originChainId = eventData.originChainId;
321
344
  const parsedFillEvent = {
345
+ ...eventData,
322
346
  transactionHash: rawFillEvent.signature,
323
347
  blockNumber: Number(rawFillEvent.slot),
324
348
  transactionIndex: 0,
325
349
  logIndex: 0,
326
350
  destinationChainId,
327
- ...(unwrapEventData(rawFillEvent.data) as Record<string, unknown>),
328
- } as unknown as FillWithBlock;
351
+ inputToken: toAddressType(eventData.inputToken, originChainId),
352
+ outputToken: toAddressType(eventData.outputToken, destinationChainId),
353
+ relayer: toAddressType(eventData.relayer, destinationChainId),
354
+ exclusiveRelayer: toAddressType(eventData.exclusiveRelayer, destinationChainId),
355
+ depositor: toAddressType(eventData.depositor, originChainId),
356
+ recipient: toAddressType(eventData.recipient, destinationChainId),
357
+ relayExecutionInfo: {
358
+ ...eventData.relayExecutionInfo,
359
+ updatedRecipient: eventData.relayExecutionInfo.updatedRecipient,
360
+ },
361
+ } as FillWithBlock;
329
362
  return parsedFillEvent;
330
363
  }
331
364
 
@@ -357,7 +390,7 @@ export async function fillRelayInstruction(
357
390
  deposit.exclusiveRelayer,
358
391
  deposit.inputToken,
359
392
  deposit.outputToken,
360
- ].map((addr) => toAddressType(addr).forceSvmAddress());
393
+ ].map((addr) => addr.forceSvmAddress());
361
394
 
362
395
  const _relayDataHash = getRelayDataHash(deposit, deposit.destinationChainId);
363
396
  const relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
@@ -368,7 +401,7 @@ export async function fillRelayInstruction(
368
401
  const [statePda, fillStatusPda, eventAuthority] = await Promise.all([
369
402
  getStatePda(spokePool.toV2Address()),
370
403
  getFillStatusPda(spokePool.toV2Address(), deposit, deposit.destinationChainId),
371
- getEventAuthority(),
404
+ getEventAuthority(spokePool.toV2Address()),
372
405
  ]);
373
406
  const depositIdBuffer = new Uint8Array(32);
374
407
  const shortenedBuffer = new Uint8Array(Buffer.from(deposit.depositId.toHexString().slice(2), "hex"));
@@ -591,11 +624,11 @@ export function getRelayDataHash(relayData: RelayData, destinationChainId: numbe
591
624
  assert(relayData.message.startsWith("0x"), "Message must be a hex string");
592
625
 
593
626
  const contentToHash = Buffer.concat([
594
- Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.depositor, "base16").toV2Address())),
595
- Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.recipient, "base16").toV2Address())),
596
- Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.exclusiveRelayer, "base16").toV2Address())),
597
- Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.inputToken, "base16").toV2Address())),
598
- Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.outputToken, "base16").toV2Address())),
627
+ Uint8Array.from(addressEncoder.encode(address(relayData.depositor.toBase58()))),
628
+ Uint8Array.from(addressEncoder.encode(address(relayData.recipient.toBase58()))),
629
+ Uint8Array.from(addressEncoder.encode(address(relayData.exclusiveRelayer.toBase58()))),
630
+ Uint8Array.from(addressEncoder.encode(address(relayData.inputToken.toBase58()))),
631
+ Uint8Array.from(addressEncoder.encode(address(relayData.outputToken.toBase58()))),
599
632
  Uint8Array.from(uint64Encoder.encode(BigInt(relayData.inputAmount.toString()))),
600
633
  Uint8Array.from(uint64Encoder.encode(BigInt(relayData.outputAmount.toString()))),
601
634
  Uint8Array.from(uint64Encoder.encode(BigInt(relayData.originChainId.toString()))),
@@ -273,13 +273,13 @@ export async function getInstructionParamsPda(programId: Address, signer: Addres
273
273
  * Returns the PDA for the Event Authority.
274
274
  * @returns The PDA for the Event Authority.
275
275
  */
276
- export const getEventAuthority = async () => {
276
+ export async function getEventAuthority(programId: Address): Promise<Address> {
277
277
  const [eventAuthority] = await getProgramDerivedAddress({
278
- programAddress: address(SvmSpokeClient.SVM_SPOKE_PROGRAM_ADDRESS),
278
+ programAddress: programId,
279
279
  seeds: ["__event_authority"],
280
280
  });
281
281
  return eventAuthority;
282
- };
282
+ }
283
283
 
284
284
  /**
285
285
  * Returns a random SVM address.
@@ -5,6 +5,7 @@ import winston from "winston";
5
5
  import { isError } from "../../typeguards";
6
6
  import {
7
7
  EventSearchConfig,
8
+ EvmAddress,
8
9
  MakeOptional,
9
10
  isArrayOf,
10
11
  isDefined,
@@ -107,7 +108,7 @@ export class AcrossConfigStoreClient extends BaseAbstractClient {
107
108
  }
108
109
 
109
110
  getRateModelForBlockNumber(
110
- l1Token: string,
111
+ l1Token: EvmAddress,
111
112
  originChainId: number | string,
112
113
  destinationChainId: number | string,
113
114
  blockNumber: number | undefined = undefined
@@ -121,7 +122,9 @@ export class AcrossConfigStoreClient extends BaseAbstractClient {
121
122
 
122
123
  const defaultRateModelUpdate = sortEventsDescending(this.cumulativeRateModelUpdates).find(
123
124
  (config) =>
124
- config.blockNumber <= (blockNumber ?? 0) && config.l1Token === l1Token && config.rateModel !== undefined
125
+ config.blockNumber <= (blockNumber ?? 0) &&
126
+ config.l1Token === l1Token.toEvmAddress() &&
127
+ config.rateModel !== undefined
125
128
  );
126
129
  if (!defaultRateModelUpdate) {
127
130
  throw new Error(`Could not find TokenConfig update for ${l1Token} at block ${blockNumber}`);
@@ -130,12 +133,12 @@ export class AcrossConfigStoreClient extends BaseAbstractClient {
130
133
  }
131
134
 
132
135
  getRouteRateModelForBlockNumber(
133
- l1Token: string,
136
+ l1Token: EvmAddress,
134
137
  route: string,
135
138
  blockNumber: number | undefined = undefined
136
139
  ): RateModel | undefined {
137
140
  const config = (sortEventsDescending(this.cumulativeRouteRateModelUpdates) as RouteRateModelUpdate[]).find(
138
- (config) => config.blockNumber <= (blockNumber ?? 0) && config.l1Token === l1Token
141
+ (config) => config.blockNumber <= (blockNumber ?? 0) && config.l1Token === l1Token.toEvmAddress()
139
142
  );
140
143
  if (config?.routeRateModel[route] === undefined) {
141
144
  return undefined;
@@ -40,9 +40,9 @@ import {
40
40
  isZeroValueDeposit,
41
41
  isZeroValueFillOrSlowFillRequest,
42
42
  chainIsEvm,
43
- isValidEvmAddress,
44
43
  duplicateEvent,
45
44
  invalidOutputToken,
45
+ Address,
46
46
  } from "../../utils";
47
47
  import winston from "winston";
48
48
  import {
@@ -67,22 +67,20 @@ type DataCache = Record<string, Promise<LoadDataReturnValue>>;
67
67
  // V3 dictionary helper functions
68
68
  function updateExpiredDepositsV3(dict: ExpiredDepositsToRefundV3, deposit: V3DepositWithBlock): void {
69
69
  // A deposit refund for a deposit is invalid if the depositor has a bytes32 address input for an EVM chain. It is valid otherwise.
70
- if (chainIsEvm(deposit.originChainId) && !isValidEvmAddress(deposit.depositor)) {
70
+ if (chainIsEvm(deposit.originChainId) && !deposit.depositor.isValidEvmAddress()) {
71
71
  return;
72
72
  }
73
73
  const { originChainId, inputToken } = deposit;
74
- if (!dict?.[originChainId]?.[inputToken]) {
75
- assign(dict, [originChainId, inputToken], []);
76
- }
77
- dict[originChainId][inputToken].push(deposit);
74
+ dict[originChainId] ??= {};
75
+ dict[originChainId][inputToken.toBytes32()] ??= [];
76
+ dict[originChainId][inputToken.toBytes32()].push(deposit);
78
77
  }
79
78
 
80
79
  function updateBundleDepositsV3(dict: BundleDepositsV3, deposit: V3DepositWithBlock): void {
81
80
  const { originChainId, inputToken } = deposit;
82
- if (!dict?.[originChainId]?.[inputToken]) {
83
- assign(dict, [originChainId, inputToken], []);
84
- }
85
- dict[originChainId][inputToken].push(deposit);
81
+ dict[originChainId] ??= {};
82
+ dict[originChainId][inputToken.toBytes32()] ??= [];
83
+ dict[originChainId][inputToken.toBytes32()].push(deposit);
86
84
  }
87
85
 
88
86
  function updateBundleFillsV3(
@@ -90,29 +88,28 @@ function updateBundleFillsV3(
90
88
  fill: V3FillWithBlock,
91
89
  lpFeePct: BigNumber,
92
90
  repaymentChainId: number,
93
- repaymentToken: string,
94
- repaymentAddress: string
91
+ repaymentToken: Address,
92
+ repaymentAddress: Address
95
93
  ): void {
96
94
  // We shouldn't pass any unrepayable fills into this function, so we perform an extra safety check.
97
- if (chainIsEvm(repaymentChainId) && !isValidEvmAddress(fill.relayer)) {
95
+ if (chainIsEvm(repaymentChainId) && !fill.relayer.isValidEvmAddress()) {
98
96
  return;
99
97
  }
100
- if (!dict?.[repaymentChainId]?.[repaymentToken]) {
101
- assign(dict, [repaymentChainId, repaymentToken], {
102
- fills: [],
103
- totalRefundAmount: bnZero,
104
- realizedLpFees: bnZero,
105
- refunds: {},
106
- });
107
- }
98
+ dict[repaymentChainId] ??= {};
99
+ dict[repaymentChainId][repaymentToken.toBytes32()] ??= {
100
+ fills: [],
101
+ totalRefundAmount: bnZero,
102
+ realizedLpFees: bnZero,
103
+ refunds: {},
104
+ };
108
105
 
109
106
  const bundleFill: BundleFillV3 = { ...fill, lpFeePct, relayer: repaymentAddress };
110
107
 
111
108
  // Add all fills, slow and fast, to dictionary.
112
- assign(dict, [repaymentChainId, repaymentToken, "fills"], [bundleFill]);
109
+ assign(dict, [repaymentChainId, repaymentToken.toBytes32(), "fills"], [bundleFill]);
113
110
 
114
111
  // All fills update the bundle LP fees.
115
- const refundObj = dict[repaymentChainId][repaymentToken];
112
+ const refundObj = dict[repaymentChainId][repaymentToken.toBytes32()];
116
113
  const realizedLpFee = bundleFill.inputAmount.mul(bundleFill.lpFeePct).div(fixedPointAdjustment);
117
114
  refundObj.realizedLpFees = refundObj.realizedLpFees ? refundObj.realizedLpFees.add(realizedLpFee) : realizedLpFee;
118
115
 
@@ -126,10 +123,11 @@ function updateBundleFillsV3(
126
123
  // Instantiate dictionary if it doesn't exist.
127
124
  refundObj.refunds ??= {};
128
125
 
129
- if (refundObj.refunds[bundleFill.relayer]) {
130
- refundObj.refunds[bundleFill.relayer] = refundObj.refunds[bundleFill.relayer].add(refundAmount);
126
+ if (refundObj.refunds[bundleFill.relayer.toBytes32()]) {
127
+ refundObj.refunds[bundleFill.relayer.toBytes32()] =
128
+ refundObj.refunds[bundleFill.relayer.toBytes32()].add(refundAmount);
131
129
  } else {
132
- refundObj.refunds[bundleFill.relayer] = refundAmount;
130
+ refundObj.refunds[bundleFill.relayer.toBytes32()] = refundAmount;
133
131
  }
134
132
  }
135
133
  }
@@ -139,21 +137,19 @@ function updateBundleExcessSlowFills(
139
137
  deposit: V3DepositWithBlock & { lpFeePct: BigNumber }
140
138
  ): void {
141
139
  const { destinationChainId, outputToken } = deposit;
142
- if (!dict?.[destinationChainId]?.[outputToken]) {
143
- assign(dict, [destinationChainId, outputToken], []);
144
- }
145
- dict[destinationChainId][outputToken].push(deposit);
140
+ dict[destinationChainId] ??= {};
141
+ dict[destinationChainId][outputToken.toBytes32()] ??= [];
142
+ dict[destinationChainId][outputToken.toBytes32()].push(deposit);
146
143
  }
147
144
 
148
145
  function updateBundleSlowFills(dict: BundleSlowFills, deposit: V3DepositWithBlock & { lpFeePct: BigNumber }): void {
149
- if (chainIsEvm(deposit.destinationChainId) && !isValidEvmAddress(deposit.recipient)) {
146
+ if (chainIsEvm(deposit.destinationChainId) && !deposit.recipient.isValidEvmAddress()) {
150
147
  return;
151
148
  }
152
149
  const { destinationChainId, outputToken } = deposit;
153
- if (!dict?.[destinationChainId]?.[outputToken]) {
154
- assign(dict, [destinationChainId, outputToken], []);
155
- }
156
- dict[destinationChainId][outputToken].push(deposit);
150
+ dict[destinationChainId] ??= {};
151
+ dict[destinationChainId][outputToken.toBytes32()] ??= [];
152
+ dict[destinationChainId][outputToken.toBytes32()].push(deposit);
157
153
  }
158
154
 
159
155
  // @notice Shared client for computing data needed to construct or validate a bundle.
@@ -489,21 +485,23 @@ export class BundleDataClient {
489
485
  // worst from the relayer's perspective.
490
486
  const { relayer, inputAmount: refundAmount } = fill;
491
487
  refundsForChain[chainToSendRefundTo] ??= {};
492
- refundsForChain[chainToSendRefundTo][repaymentToken] ??= {};
493
- const existingRefundAmount = refundsForChain[chainToSendRefundTo][repaymentToken][relayer] ?? bnZero;
494
- refundsForChain[chainToSendRefundTo][repaymentToken][relayer] = existingRefundAmount.add(refundAmount);
488
+ refundsForChain[chainToSendRefundTo][repaymentToken.toBytes32()] ??= {};
489
+ const existingRefundAmount =
490
+ refundsForChain[chainToSendRefundTo][repaymentToken.toBytes32()][relayer.toBytes32()] ?? bnZero;
491
+ refundsForChain[chainToSendRefundTo][repaymentToken.toBytes32()][relayer.toBytes32()] =
492
+ existingRefundAmount.add(refundAmount);
495
493
  });
496
494
  }
497
495
  return refundsForChain;
498
496
  }
499
497
 
500
- getUpcomingDepositAmount(chainId: number, l2Token: string, latestBlockToSearch: number): BigNumber {
498
+ getUpcomingDepositAmount(chainId: number, l2Token: Address, latestBlockToSearch: number): BigNumber {
501
499
  if (this.spokePoolClients[chainId] === undefined) {
502
500
  return toBN(0);
503
501
  }
504
502
  return this.spokePoolClients[chainId]
505
503
  .getDeposits()
506
- .filter((deposit) => deposit.blockNumber > latestBlockToSearch && deposit.inputToken === l2Token)
504
+ .filter((deposit) => deposit.blockNumber > latestBlockToSearch && deposit.inputToken.eq(l2Token))
507
505
  .reduce((acc, deposit) => {
508
506
  return acc.add(deposit.inputAmount);
509
507
  }, toBN(0));
@@ -626,18 +624,18 @@ export class BundleDataClient {
626
624
  const executedRefunds: { [tokenAddress: string]: { [relayer: string]: BigNumber } } = {};
627
625
  for (const refundLeaf of executedRefundLeaves) {
628
626
  const tokenAddress = refundLeaf.l2TokenAddress;
629
- if (executedRefunds[tokenAddress] === undefined) {
630
- executedRefunds[tokenAddress] = {};
627
+ if (executedRefunds[tokenAddress.toBytes32()] === undefined) {
628
+ executedRefunds[tokenAddress.toBytes32()] = {};
631
629
  }
632
- const executedTokenRefunds = executedRefunds[tokenAddress];
630
+ const executedTokenRefunds = executedRefunds[tokenAddress.toBytes32()];
633
631
 
634
632
  for (let i = 0; i < refundLeaf.refundAddresses.length; i++) {
635
633
  const relayer = refundLeaf.refundAddresses[i];
636
634
  const refundAmount = refundLeaf.refundAmounts[i];
637
- if (executedTokenRefunds[relayer] === undefined) {
638
- executedTokenRefunds[relayer] = bnZero;
635
+ if (executedTokenRefunds[relayer.toBytes32()] === undefined) {
636
+ executedTokenRefunds[relayer.toBytes32()] = bnZero;
639
637
  }
640
- executedTokenRefunds[relayer] = executedTokenRefunds[relayer].add(refundAmount);
638
+ executedTokenRefunds[relayer.toBytes32()] = executedTokenRefunds[relayer.toBytes32()].add(refundAmount);
641
639
  }
642
640
  }
643
641
  return executedRefunds;
@@ -678,15 +676,15 @@ export class BundleDataClient {
678
676
  return allRefunds;
679
677
  }
680
678
 
681
- getRefundsFor(bundleRefunds: CombinedRefunds, relayer: string, chainId: number, token: string): BigNumber {
682
- if (!bundleRefunds[chainId] || !bundleRefunds[chainId][token]) {
679
+ getRefundsFor(bundleRefunds: CombinedRefunds, relayer: Address, chainId: number, token: Address): BigNumber {
680
+ if (!bundleRefunds[chainId] || !bundleRefunds[chainId][token.toBytes32()]) {
683
681
  return BigNumber.from(0);
684
682
  }
685
- const allRefunds = bundleRefunds[chainId][token];
686
- return allRefunds && allRefunds[relayer] ? allRefunds[relayer] : BigNumber.from(0);
683
+ const allRefunds = bundleRefunds[chainId][token.toBytes32()];
684
+ return allRefunds && allRefunds[relayer.toBytes32()] ? allRefunds[relayer.toBytes32()] : BigNumber.from(0);
687
685
  }
688
686
 
689
- getTotalRefund(refunds: CombinedRefunds[], relayer: string, chainId: number, refundToken: string): BigNumber {
687
+ getTotalRefund(refunds: CombinedRefunds[], relayer: Address, chainId: number, refundToken: Address): BigNumber {
690
688
  return refunds.reduce((totalRefund, refunds) => {
691
689
  return totalRefund.add(this.getRefundsFor(refunds, relayer, chainId, refundToken));
692
690
  }, bnZero);
@@ -899,7 +897,11 @@ export class BundleDataClient {
899
897
  "Not using correct bundle deposit hash key"
900
898
  );
901
899
  if (deposit.blockNumber >= originChainBlockRange[0]) {
902
- if (bundleDepositsV3?.[originChainId]?.[deposit.inputToken]?.find((d) => duplicateEvent(deposit, d))) {
900
+ if (
901
+ bundleDepositsV3?.[originChainId]?.[deposit.inputToken.toBytes32()]?.find((d) =>
902
+ duplicateEvent(deposit, d)
903
+ )
904
+ ) {
903
905
  this.logger.debug({
904
906
  at: "BundleDataClient#loadData",
905
907
  message: "Duplicate deposit detected",
@@ -17,6 +17,7 @@ import {
17
17
  fixedPointAdjustment,
18
18
  count2DDictionaryValues,
19
19
  count3DDictionaryValues,
20
+ toAddressType,
20
21
  } from "../../../utils";
21
22
  import {
22
23
  addLastRunningBalance,
@@ -65,10 +66,10 @@ export function getRefundsFromBundle(
65
66
  Object.entries(depositsForChain).forEach(([l2TokenAddress, deposits]) => {
66
67
  deposits.forEach((deposit) => {
67
68
  if (combinedRefunds[originChainId][l2TokenAddress] === undefined) {
68
- combinedRefunds[originChainId][l2TokenAddress] = { [deposit.depositor]: deposit.inputAmount };
69
+ combinedRefunds[originChainId][l2TokenAddress] = { [deposit.depositor.toBytes32()]: deposit.inputAmount };
69
70
  } else {
70
- const existingRefundAmount = combinedRefunds[originChainId][l2TokenAddress][deposit.depositor];
71
- combinedRefunds[originChainId][l2TokenAddress][deposit.depositor] = deposit.inputAmount.add(
71
+ const existingRefundAmount = combinedRefunds[originChainId][l2TokenAddress][deposit.depositor.toBytes32()];
72
+ combinedRefunds[originChainId][l2TokenAddress][deposit.depositor.toBytes32()] = deposit.inputAmount.add(
72
73
  existingRefundAmount ?? bnZero
73
74
  );
74
75
  }
@@ -153,19 +154,23 @@ export function _buildPoolRebalanceRoot(
153
154
  // If the repayment token and repayment chain ID do not map to a PoolRebalanceRoute graph, then
154
155
  // there are no relevant L1 running balances.
155
156
  if (
156
- !clients.hubPoolClient.l2TokenHasPoolRebalanceRoute(l2TokenAddress, repaymentChainId, mainnetBundleEndBlock)
157
+ !clients.hubPoolClient.l2TokenHasPoolRebalanceRoute(
158
+ toAddressType(l2TokenAddress, repaymentChainId),
159
+ repaymentChainId,
160
+ mainnetBundleEndBlock
161
+ )
157
162
  ) {
158
163
  chainWithRefundsOnly.add(repaymentChainId);
159
164
  return;
160
165
  }
161
166
  const l1TokenCounterpart = clients.hubPoolClient.getL1TokenForL2TokenAtBlock(
162
- l2TokenAddress,
167
+ toAddressType(l2TokenAddress, repaymentChainId),
163
168
  repaymentChainId,
164
169
  mainnetBundleEndBlock
165
170
  );
166
171
 
167
- updateRunningBalance(runningBalances, repaymentChainId, l1TokenCounterpart, totalRefundAmount);
168
- updateRunningBalance(realizedLpFees, repaymentChainId, l1TokenCounterpart, totalRealizedLpFee);
172
+ updateRunningBalance(runningBalances, repaymentChainId, l1TokenCounterpart.toEvmAddress(), totalRefundAmount);
173
+ updateRunningBalance(realizedLpFees, repaymentChainId, l1TokenCounterpart.toEvmAddress(), totalRealizedLpFee);
169
174
  }
170
175
  );
171
176
  });
@@ -182,12 +187,17 @@ export function _buildPoolRebalanceRoot(
182
187
  Object.entries(depositsForChain).forEach(([outputToken, deposits]) => {
183
188
  deposits.forEach((deposit) => {
184
189
  const l1TokenCounterpart = clients.hubPoolClient.getL1TokenForL2TokenAtBlock(
185
- outputToken,
190
+ toAddressType(outputToken, destinationChainId),
186
191
  destinationChainId,
187
192
  mainnetBundleEndBlock
188
193
  );
189
194
  const lpFee = deposit.lpFeePct.mul(deposit.inputAmount).div(fixedPointAdjustment);
190
- updateRunningBalance(runningBalances, destinationChainId, l1TokenCounterpart, deposit.inputAmount.sub(lpFee));
195
+ updateRunningBalance(
196
+ runningBalances,
197
+ destinationChainId,
198
+ l1TokenCounterpart.toEvmAddress(),
199
+ deposit.inputAmount.sub(lpFee)
200
+ );
191
201
  // Slow fill LP fees are accounted for when the slow fill executes and a V3FilledRelay is emitted. i.e. when
192
202
  // the slow fill execution is included in bundleFillsV3.
193
203
  });
@@ -206,12 +216,17 @@ export function _buildPoolRebalanceRoot(
206
216
  Object.entries(slowFilledDepositsForChain).forEach(([outputToken, slowFilledDeposits]) => {
207
217
  slowFilledDeposits.forEach((deposit) => {
208
218
  const l1TokenCounterpart = clients.hubPoolClient.getL1TokenForL2TokenAtBlock(
209
- outputToken,
219
+ toAddressType(outputToken, destinationChainId),
210
220
  destinationChainId,
211
221
  mainnetBundleEndBlock
212
222
  );
213
223
  const lpFee = deposit.lpFeePct.mul(deposit.inputAmount).div(fixedPointAdjustment);
214
- updateRunningBalance(runningBalances, destinationChainId, l1TokenCounterpart, lpFee.sub(deposit.inputAmount));
224
+ updateRunningBalance(
225
+ runningBalances,
226
+ destinationChainId,
227
+ l1TokenCounterpart.toEvmAddress(),
228
+ lpFee.sub(deposit.inputAmount)
229
+ );
215
230
  // Slow fills don't add to lpFees, only when the slow fill is executed and a V3FilledRelay is emitted, so
216
231
  // we don't need to subtract it here. Moreover, the HubPoole expects bundleLpFees to be > 0.
217
232
  });
@@ -271,11 +286,11 @@ export function _buildPoolRebalanceRoot(
271
286
  return;
272
287
  }
273
288
  const l1TokenCounterpart = clients.hubPoolClient.getL1TokenForL2TokenAtBlock(
274
- inputToken,
289
+ toAddressType(inputToken, originChainId),
275
290
  originChainId,
276
291
  mainnetBundleEndBlock
277
292
  );
278
- updateRunningBalance(runningBalances, originChainId, l1TokenCounterpart, deposit.inputAmount);
293
+ updateRunningBalance(runningBalances, originChainId, l1TokenCounterpart.toEvmAddress(), deposit.inputAmount);
279
294
  });
280
295
  });
281
296
  });
@@ -2,7 +2,7 @@ import _ from "lodash";
2
2
  import assert from "assert";
3
3
  import { providers } from "ethers";
4
4
  import { DepositWithBlock, Fill, FillWithBlock } from "../../../interfaces";
5
- import { isSlowFill, isValidEvmAddress, isDefined, chainIsEvm } from "../../../utils";
5
+ import { isSlowFill, isValidEvmAddress, isDefined, chainIsEvm, Address, toAddressType } from "../../../utils";
6
6
  import { HubPoolClient } from "../../HubPoolClient";
7
7
  import { SVMProvider } from "../../../arch/svm";
8
8
 
@@ -25,7 +25,7 @@ export function getRefundInformationFromFill(
25
25
  bundleEndBlockForMainnet: number
26
26
  ): {
27
27
  chainToSendRefundTo: number;
28
- repaymentToken: string;
28
+ repaymentToken: Address;
29
29
  } {
30
30
  const chainToSendRefundTo = _getRepaymentChainId(relayData, hubPoolClient, bundleEndBlockForMainnet);
31
31
  if (chainToSendRefundTo === relayData.originChainId) {
@@ -49,6 +49,7 @@ export function getRefundInformationFromFill(
49
49
  chainToSendRefundTo,
50
50
  bundleEndBlockForMainnet
51
51
  );
52
+
52
53
  return {
53
54
  chainToSendRefundTo,
54
55
  repaymentToken,
@@ -125,7 +126,8 @@ export async function verifyFillRepayment(
125
126
  return undefined;
126
127
  }
127
128
  }
128
- fill.relayer = destinationRelayer;
129
+ fill.relayer = toAddressType(destinationRelayer);
130
+ assert(fill.relayer.isValidEvmAddress(), `Cannot re-assign fill to msg.sender: ${destinationRelayer}`);
129
131
  } else {
130
132
  return undefined;
131
133
  }
@@ -200,5 +202,5 @@ function _repaymentAddressNeedsToBeOverwritten(fill: Fill): boolean {
200
202
  // - i.e. If chainIsSvm && !isValidSvmAddress(fill.relayer) then return false
201
203
  // If chainIsEvm && !isValidEvmAddress(fill.relayer) then return false
202
204
  // If chainIsEvm && isValidEvmAddress(fill.relayer) then return true
203
- return !isValidEvmAddress(fill.relayer);
205
+ return chainIsEvm(fill.repaymentChainId) && !fill.relayer.isValidEvmAddress();
204
206
  }
@@ -21,6 +21,12 @@ export function buildPoolRebalanceLeafTree(poolRebalanceLeaves: PoolRebalanceLea
21
21
  }
22
22
 
23
23
  const paramType = getParamType("MerkleLibTest", "verifyPoolRebalance", "rebalance");
24
- const hashFn = (input: PoolRebalanceLeaf) => utils.keccak256(utils.defaultAbiCoder.encode([paramType], [input]));
24
+ const hashFn = (input: PoolRebalanceLeaf) => {
25
+ const ethersLeaf = {
26
+ ...input,
27
+ l1Tokens: input.l1Tokens.map((l1Token) => l1Token.toEvmAddress()),
28
+ };
29
+ return utils.keccak256(utils.defaultAbiCoder.encode([paramType], [ethersLeaf]));
30
+ };
25
31
  return new MerkleTree<PoolRebalanceLeaf>(poolRebalanceLeaves, hashFn);
26
32
  }