@across-protocol/contracts 4.0.11 → 4.0.12

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 (53) hide show
  1. package/dist/scripts/svm/{enableRoute.js → createVault.js} +13 -35
  2. package/dist/scripts/svm/fakeFillWithRandomDistribution.js +9 -8
  3. package/dist/scripts/svm/nativeDeposit.js +138 -0
  4. package/dist/scripts/svm/queryEventsV2.js +3 -3
  5. package/dist/scripts/svm/{queryRoute.js → queryVault.js} +10 -25
  6. package/dist/scripts/svm/remoteHubPoolPauseDeposits.js +2 -2
  7. package/dist/scripts/svm/simpleDeposit.js +3 -12
  8. package/dist/scripts/svm/simpleFakeRelayerRepayment.js +2 -9
  9. package/dist/scripts/svm/simpleFill.js +3 -2
  10. package/dist/src/svm/assets/idl/svm_spoke.json +43 -369
  11. package/dist/src/svm/assets/svm_spoke.d.ts +40 -366
  12. package/dist/src/svm/clients/SvmSpoke/accounts/index.d.ts +0 -1
  13. package/dist/src/svm/clients/SvmSpoke/accounts/index.js +0 -1
  14. package/dist/src/svm/clients/SvmSpoke/errors/svmSpoke.d.ts +3 -1
  15. package/dist/src/svm/clients/SvmSpoke/errors/svmSpoke.js +4 -1
  16. package/dist/src/svm/clients/SvmSpoke/instructions/deposit.d.ts +21 -13
  17. package/dist/src/svm/clients/SvmSpoke/instructions/deposit.js +38 -6
  18. package/dist/src/svm/clients/SvmSpoke/instructions/depositNow.d.ts +21 -13
  19. package/dist/src/svm/clients/SvmSpoke/instructions/depositNow.js +38 -6
  20. package/dist/src/svm/clients/SvmSpoke/instructions/fillRelay.d.ts +20 -16
  21. package/dist/src/svm/clients/SvmSpoke/instructions/fillRelay.js +6 -1
  22. package/dist/src/svm/clients/SvmSpoke/instructions/index.d.ts +0 -1
  23. package/dist/src/svm/clients/SvmSpoke/instructions/index.js +0 -1
  24. package/dist/src/svm/clients/SvmSpoke/instructions/unsafeDeposit.d.ts +21 -13
  25. package/dist/src/svm/clients/SvmSpoke/instructions/unsafeDeposit.js +38 -6
  26. package/dist/src/svm/clients/SvmSpoke/programs/svmSpoke.d.ts +6 -10
  27. package/dist/src/svm/clients/SvmSpoke/programs/svmSpoke.js +5 -13
  28. package/dist/src/svm/clients/SvmSpoke/types/index.d.ts +0 -1
  29. package/dist/src/svm/clients/SvmSpoke/types/index.js +0 -1
  30. package/dist/src/svm/web3-v1/helpers.d.ts +114 -1
  31. package/dist/src/svm/web3-v1/helpers.js +179 -1
  32. package/dist/target/types/svm_spoke.d.ts +40 -366
  33. package/dist/test/svm/SvmSpoke.Deposit.js +143 -176
  34. package/dist/test/svm/SvmSpoke.Fill.AcrossPlus.js +20 -17
  35. package/dist/test/svm/SvmSpoke.Fill.js +52 -38
  36. package/dist/test/svm/SvmSpoke.HandleReceiveMessage.js +2 -114
  37. package/dist/test/svm/SvmSpoke.SlowFill.AcrossPlus.js +2 -2
  38. package/dist/test/svm/SvmSpoke.SlowFill.js +37 -34
  39. package/dist/test/svm/SvmSpoke.common.d.ts +2 -3
  40. package/dist/test/svm/SvmSpoke.common.js +3 -12
  41. package/package.json +1 -1
  42. package/dist/scripts/svm/remoteHubPoolSetDepositRoute.d.ts +0 -1
  43. package/dist/scripts/svm/remoteHubPoolSetDepositRoute.js +0 -252
  44. package/dist/src/svm/clients/SvmSpoke/accounts/route.d.ts +0 -27
  45. package/dist/src/svm/clients/SvmSpoke/accounts/route.js +0 -66
  46. package/dist/src/svm/clients/SvmSpoke/instructions/setEnableRoute.d.ts +0 -95
  47. package/dist/src/svm/clients/SvmSpoke/instructions/setEnableRoute.js +0 -213
  48. package/dist/src/svm/clients/SvmSpoke/types/enabledDepositRoute.d.ts +0 -21
  49. package/dist/src/svm/clients/SvmSpoke/types/enabledDepositRoute.js +0 -30
  50. package/dist/test/svm/SvmSpoke.Routes.js +0 -167
  51. /package/dist/scripts/svm/{enableRoute.d.ts → createVault.d.ts} +0 -0
  52. /package/dist/scripts/svm/{queryRoute.d.ts → nativeDeposit.d.ts} +0 -0
  53. /package/dist/{test/svm/SvmSpoke.Routes.d.ts → scripts/svm/queryVault.d.ts} +0 -0
@@ -36,24 +36,26 @@ const utils_1 = require("./utils");
36
36
  const { provider, connection, program, owner, chainId, seedBalance, recipient, initializeState, setCurrentTime, assertSE, assert, } = SvmSpoke_common_1.common;
37
37
  describe("svm_spoke.fill", () => {
38
38
  anchor.setProvider(provider);
39
- const payer = anchor.AnchorProvider.env().wallet.payer;
39
+ const { payer } = anchor.AnchorProvider.env().wallet;
40
40
  const relayer = web3_js_1.Keypair.generate();
41
41
  const otherRelayer = web3_js_1.Keypair.generate();
42
42
  const { encodedMessage, fillRemainingAccounts } = (0, utils_1.testAcrossPlusMessage)();
43
43
  const tokenDecimals = 6;
44
- let state, mint, relayerTA, recipientTA, otherRelayerTA, tokenProgram;
44
+ let state, mint, relayerTA, recipientTA, otherRelayerTA, tokenProgram, seed;
45
45
  const relayAmount = 500000;
46
46
  let relayData; // reused relay data for all tests.
47
47
  let accounts; // Store accounts to simplify contract interactions.
48
- function updateRelayData(newRelayData) {
48
+ const updateRelayData = (newRelayData) => {
49
49
  relayData = newRelayData;
50
50
  const relayHashUint8Array = (0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId);
51
51
  const [fillStatusPDA] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("fills"), relayHashUint8Array], program.programId);
52
+ const { pda: delegatePda } = (0, web3_v1_1.getFillRelayDelegatePda)(relayHashUint8Array, new anchor_1.BN(1), relayer.publicKey, program.programId);
52
53
  accounts = {
53
54
  state,
55
+ delegate: delegatePda,
54
56
  signer: relayer.publicKey,
55
57
  instructionParams: program.programId,
56
- mint: mint,
58
+ mint,
57
59
  relayerTokenAccount: relayerTA,
58
60
  recipientTokenAccount: recipientTA,
59
61
  fillStatus: fillStatusPDA,
@@ -62,18 +64,17 @@ describe("svm_spoke.fill", () => {
62
64
  systemProgram: anchor.web3.SystemProgram.programId,
63
65
  program: program.programId,
64
66
  };
65
- }
67
+ };
66
68
  const approvedFillRelay = async (fillDataValues, calledFillAccounts = accounts, callingRelayer = relayer) => {
67
- // Delegate state PDA to pull relayer tokens.
68
- const approveIx = await (0, spl_token_1.createApproveCheckedInstruction)(calledFillAccounts.relayerTokenAccount, calledFillAccounts.mint, calledFillAccounts.state, calledFillAccounts.signer, BigInt(fillDataValues[1].outputAmount.toString()), tokenDecimals, undefined, tokenProgram);
69
+ const relayHash = Uint8Array.from(fillDataValues[0]);
70
+ const { seedHash, pda: delegatePda } = (0, web3_v1_1.getFillRelayDelegatePda)(relayHash, fillDataValues[2], fillDataValues[3], program.programId);
71
+ const approveIx = await (0, spl_token_1.createApproveCheckedInstruction)(calledFillAccounts.relayerTokenAccount, calledFillAccounts.mint, delegatePda, calledFillAccounts.signer, BigInt(fillDataValues[1].outputAmount.toString()), tokenDecimals, undefined, tokenProgram);
69
72
  const fillIx = await program.methods
70
73
  .fillRelay(...fillDataValues)
71
- .accounts(calledFillAccounts)
74
+ .accounts({ ...calledFillAccounts, delegate: delegatePda })
72
75
  .remainingAccounts(fillRemainingAccounts)
73
76
  .instruction();
74
- const fillTx = new web3_js_1.Transaction().add(approveIx, fillIx);
75
- const tx = await (0, web3_js_1.sendAndConfirmTransaction)(connection, fillTx, [payer, callingRelayer]);
76
- return tx;
77
+ return (0, web3_js_1.sendAndConfirmTransaction)(connection, new web3_js_1.Transaction().add(approveIx, fillIx), [payer, callingRelayer]);
77
78
  };
78
79
  before("Funds relayer wallets", async () => {
79
80
  await connection.requestAirdrop(relayer.publicKey, 10_000_000_000); // 10 SOL
@@ -90,7 +91,7 @@ describe("svm_spoke.fill", () => {
90
91
  await connection.requestAirdrop(otherRelayer.publicKey, 10_000_000_000); // 10 SOL
91
92
  });
92
93
  beforeEach(async () => {
93
- ({ state } = await initializeState());
94
+ ({ state, seed } = await initializeState());
94
95
  tokenProgram = spl_token_1.TOKEN_PROGRAM_ID; // Some tests might override this.
95
96
  const initialRelayData = {
96
97
  depositor: recipient,
@@ -108,7 +109,7 @@ describe("svm_spoke.fill", () => {
108
109
  };
109
110
  updateRelayData(initialRelayData);
110
111
  });
111
- it("Fills a V3 relay and verifies balances", async () => {
112
+ it("Fills a relay and verifies balances", async () => {
112
113
  // Verify recipient's balance before the fill
113
114
  let recipientAccount = await (0, spl_token_1.getAccount)(connection, recipientTA);
114
115
  assertSE(recipientAccount.amount, "0", "Recipient's balance should be 0 before the fill");
@@ -116,7 +117,7 @@ describe("svm_spoke.fill", () => {
116
117
  let relayerAccount = await (0, spl_token_1.getAccount)(connection, relayerTA);
117
118
  assertSE(relayerAccount.amount, seedBalance, "Relayer's balance should be equal to seed balance before the fill");
118
119
  const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId));
119
- await approvedFillRelay([relayHash, relayData, new anchor_1.BN(1), relayer.publicKey]);
120
+ await approvedFillRelay([relayHash, relayData, chainId, relayer.publicKey]);
120
121
  // Verify relayer's balance after the fill
121
122
  relayerAccount = await (0, spl_token_1.getAccount)(connection, relayerTA);
122
123
  assertSE(relayerAccount.amount, seedBalance - relayAmount, "Relayer's balance should be reduced by the relay amount");
@@ -136,8 +137,9 @@ describe("svm_spoke.fill", () => {
136
137
  if (key === "message") {
137
138
  assertSE(event.messageHash, (0, web3_v1_1.hashNonEmptyMessage)(value), `MessageHash should match`);
138
139
  }
139
- else
140
+ else {
140
141
  assertSE(event[key], value, `${key.charAt(0).toUpperCase() + key.slice(1)} should match`);
142
+ }
141
143
  });
142
144
  // RelayExecutionInfo should match.
143
145
  assertSE(event.relayExecutionInfo.updatedRecipient, relayData.recipient, "UpdatedRecipient should match");
@@ -148,7 +150,7 @@ describe("svm_spoke.fill", () => {
148
150
  assertSE(event.repaymentChainId, new anchor_1.BN(420), "Repayment chain id should match");
149
151
  assertSE(event.relayer, otherRelayer.publicKey, "Repayment address should match");
150
152
  });
151
- it("Fails to fill a V3 relay after the fill deadline", async () => {
153
+ it("Fails to fill a relay after the fill deadline", async () => {
152
154
  updateRelayData({ ...relayData, fillDeadline: Math.floor(Date.now() / 1000) - 69 }); // 69 seconds ago
153
155
  const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId));
154
156
  try {
@@ -159,7 +161,7 @@ describe("svm_spoke.fill", () => {
159
161
  assert.include(err.toString(), "ExpiredFillDeadline", "Expected ExpiredFillDeadline error");
160
162
  }
161
163
  });
162
- it("Fails to fill a V3 relay by non-exclusive relayer before exclusivity deadline", async () => {
164
+ it("Fails to fill a relay by non-exclusive relayer before exclusivity deadline", async () => {
163
165
  accounts.signer = otherRelayer.publicKey;
164
166
  accounts.relayerTokenAccount = otherRelayerTA;
165
167
  const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId));
@@ -186,7 +188,7 @@ describe("svm_spoke.fill", () => {
186
188
  const recipientAccountAfter = await (0, spl_token_1.getAccount)(connection, recipientTA);
187
189
  assertSE(recipientAccountAfter.amount, BigInt(recipientAccountBefore.amount) + BigInt(relayAmount), "Recipient's balance should be increased by the relay amount");
188
190
  });
189
- it("Fails to fill a V3 relay with the same deposit data multiple times", async () => {
191
+ it("Fails to fill a relay with the same deposit data multiple times", async () => {
190
192
  const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId));
191
193
  // First fill attempt
192
194
  await approvedFillRelay([relayHash, relayData, new anchor_1.BN(1), relayer.publicKey]);
@@ -207,7 +209,7 @@ describe("svm_spoke.fill", () => {
207
209
  fillStatus: accounts.fillStatus,
208
210
  systemProgram: anchor.web3.SystemProgram.programId,
209
211
  };
210
- // Execute the fill_v3_relay call
212
+ // Execute the fill_relay call
211
213
  await approvedFillRelay([relayHash, relayData, new anchor_1.BN(1), relayer.publicKey]);
212
214
  // Verify the fill PDA exists before closing
213
215
  const fillStatusAccountBefore = await connection.getAccountInfo(accounts.fillStatus);
@@ -228,17 +230,17 @@ describe("svm_spoke.fill", () => {
228
230
  const fillStatusAccountAfter = await connection.getAccountInfo(accounts.fillStatus);
229
231
  assert.isNull(fillStatusAccountAfter, "Fill PDA should be closed after closing");
230
232
  });
231
- it("Fetches FillStatusAccount before and after fillV3Relay", async () => {
233
+ it("Fetches FillStatusAccount before and after fillRelay", async () => {
232
234
  const relayHash = (0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId);
233
235
  const [fillStatusPDA] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("fills"), relayHash], program.programId);
234
- // Fetch FillStatusAccount before fillV3Relay
236
+ // Fetch FillStatusAccount before fillRelay
235
237
  let fillStatusAccount = await program.account.fillStatusAccount.fetchNullable(fillStatusPDA);
236
- assert.isNull(fillStatusAccount, "FillStatusAccount should be uninitialized before fillV3Relay");
238
+ assert.isNull(fillStatusAccount, "FillStatusAccount should be uninitialized before fillRelay");
237
239
  // Fill the relay
238
240
  await approvedFillRelay([Array.from(relayHash), relayData, new anchor_1.BN(1), relayer.publicKey]);
239
- // Fetch FillStatusAccount after fillV3Relay
241
+ // Fetch FillStatusAccount after fillRelay
240
242
  fillStatusAccount = await program.account.fillStatusAccount.fetch(fillStatusPDA);
241
- assert.isNotNull(fillStatusAccount, "FillStatusAccount should be initialized after fillV3Relay");
243
+ assert.isNotNull(fillStatusAccount, "FillStatusAccount should be initialized after fillRelay");
242
244
  assert.equal(JSON.stringify(fillStatusAccount.status), `{\"filled\":{}}`, "FillStatus should be Filled");
243
245
  assert.equal(fillStatusAccount.relayer.toString(), relayer.publicKey.toString(), "Caller should be set as relayer");
244
246
  });
@@ -297,7 +299,7 @@ describe("svm_spoke.fill", () => {
297
299
  assert.include(err.toString(), "InvalidMint", "Expected InvalidMint error");
298
300
  }
299
301
  });
300
- it("Fills a V3 relay from custom relayer token account", async () => {
302
+ it("Fills a relay from custom relayer token account", async () => {
301
303
  // Create and mint to custom relayer token account
302
304
  const customKeypair = web3_js_1.Keypair.generate();
303
305
  const customRelayerTA = await (0, spl_token_1.createAccount)(connection, payer, mint, relayer.publicKey, customKeypair);
@@ -327,7 +329,8 @@ describe("svm_spoke.fill", () => {
327
329
  };
328
330
  updateRelayData(newRelayData);
329
331
  accounts.recipientTokenAccount = newRecipientATA;
330
- const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(newRelayData, chainId));
332
+ const relayHashUint8Array = (0, web3_v1_1.calculateRelayHashUint8Array)(newRelayData, chainId);
333
+ const relayHash = Array.from(relayHashUint8Array);
331
334
  try {
332
335
  await approvedFillRelay([relayHash, newRelayData, new anchor_1.BN(1), relayer.publicKey]);
333
336
  assert.fail("Fill should have failed due to missing ATA");
@@ -344,11 +347,12 @@ describe("svm_spoke.fill", () => {
344
347
  { pubkey: newRecipientATA, isWritable: true, isSigner: false },
345
348
  ])
346
349
  .instruction();
350
+ const { pda: delegatePda } = (0, web3_v1_1.getFillRelayDelegatePda)(relayHashUint8Array, new anchor_1.BN(1), relayer.publicKey, program.programId);
347
351
  // Fill the deposit in the same transaction
348
- const approveInstruction = await (0, spl_token_1.createApproveCheckedInstruction)(accounts.relayerTokenAccount, accounts.mint, accounts.state, accounts.signer, BigInt(newRelayData.outputAmount.toString()), tokenDecimals, undefined, tokenProgram);
352
+ const approveInstruction = await (0, spl_token_1.createApproveCheckedInstruction)(accounts.relayerTokenAccount, accounts.mint, delegatePda, accounts.signer, BigInt(newRelayData.outputAmount.toString()), tokenDecimals, undefined, tokenProgram);
349
353
  const fillInstruction = await program.methods
350
354
  .fillRelay(relayHash, newRelayData, new anchor_1.BN(1), relayer.publicKey)
351
- .accounts(accounts)
355
+ .accounts({ ...accounts, delegate: delegatePda })
352
356
  .remainingAccounts(fillRemainingAccounts)
353
357
  .instruction();
354
358
  // Create and send the transaction
@@ -377,7 +381,7 @@ describe("svm_spoke.fill", () => {
377
381
  .instruction();
378
382
  // Build instructions for all fills
379
383
  let totalFillAmount = new anchor_1.BN(0);
380
- const fillInstructions = [];
384
+ const approveAndfillInstructions = [];
381
385
  for (let i = 0; i < numberOfFills; i++) {
382
386
  const newRelayData = {
383
387
  ...relayData,
@@ -387,17 +391,20 @@ describe("svm_spoke.fill", () => {
387
391
  totalFillAmount = totalFillAmount.add(newRelayData.outputAmount);
388
392
  updateRelayData(newRelayData);
389
393
  accounts.recipientTokenAccount = recipientAssociatedTokens[i];
390
- const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(newRelayData, chainId));
394
+ const relayHashUint8Array = (0, web3_v1_1.calculateRelayHashUint8Array)(newRelayData, chainId);
395
+ const relayHash = Array.from(relayHashUint8Array);
396
+ const { pda: delegatePda } = (0, web3_v1_1.getFillRelayDelegatePda)(relayHashUint8Array, new anchor_1.BN(1), relayer.publicKey, program.programId);
397
+ const approveInstruction = await (0, spl_token_1.createApproveCheckedInstruction)(accounts.relayerTokenAccount, accounts.mint, delegatePda, accounts.signer, BigInt(totalFillAmount.toString()), tokenDecimals, undefined, tokenProgram);
398
+ approveAndfillInstructions.push(approveInstruction);
391
399
  const fillInstruction = await program.methods
392
400
  .fillRelay(relayHash, newRelayData, new anchor_1.BN(1), relayer.publicKey)
393
- .accounts(accounts)
401
+ .accounts({ ...accounts, delegate: delegatePda })
394
402
  .remainingAccounts(fillRemainingAccounts)
395
403
  .instruction();
396
- fillInstructions.push(fillInstruction);
404
+ approveAndfillInstructions.push(fillInstruction);
397
405
  }
398
- const approveInstruction = await (0, spl_token_1.createApproveCheckedInstruction)(accounts.relayerTokenAccount, accounts.mint, accounts.state, accounts.signer, BigInt(totalFillAmount.toString()), tokenDecimals, undefined, tokenProgram);
399
406
  // Fill using the ALT.
400
- await (0, web3_v1_1.sendTransactionWithLookupTable)(connection, [createTokenAccountsInstruction, approveInstruction, ...fillInstructions], relayer);
407
+ await (0, web3_v1_1.sendTransactionWithLookupTable)(connection, [createTokenAccountsInstruction, ...approveAndfillInstructions], relayer);
401
408
  // Verify balances after the fill
402
409
  await new Promise((resolve) => setTimeout(resolve, 500)); // Wait for tx processing
403
410
  const fRelayerBal = (await (0, spl_token_1.getAccount)(connection, relayerTA)).amount;
@@ -460,9 +467,12 @@ describe("svm_spoke.fill", () => {
460
467
  assertSE(recipientAccount.amount, "0", "Recipient's balance should be 0 before the fill");
461
468
  let relayerAccount = await (0, spl_token_1.getAccount)(connection, relayerTA);
462
469
  assertSE(relayerAccount.amount, seedBalance, "Relayer's balance should be equal to seed balance before the fill");
463
- const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId));
470
+ const relayHashUint8Array = (0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId);
471
+ const relayHash = Array.from(relayHashUint8Array);
472
+ const delegate = (0, kit_1.address)((0, web3_v1_1.getFillRelayDelegatePda)(relayHashUint8Array, new anchor_1.BN(1), relayer.publicKey, program.programId).pda.toString());
464
473
  const formattedAccounts = {
465
474
  state: (0, kit_1.address)(accounts.state.toString()),
475
+ delegate,
466
476
  instructionParams: (0, kit_1.address)(program.programId.toString()),
467
477
  mint: (0, kit_1.address)(mint.toString()),
468
478
  relayerTokenAccount: (0, kit_1.address)(relayerTA.toString()),
@@ -497,7 +507,7 @@ describe("svm_spoke.fill", () => {
497
507
  const approveIx = (0, token_1.getApproveCheckedInstruction)({
498
508
  source: (0, kit_1.address)(accounts.relayerTokenAccount.toString()),
499
509
  mint: (0, kit_1.address)(accounts.mint.toString()),
500
- delegate: (0, kit_1.address)(accounts.state.toString()),
510
+ delegate,
501
511
  owner: (0, kit_1.address)(accounts.signer.toString()),
502
512
  amount: BigInt(relayData.outputAmount.toString()),
503
513
  decimals: tokenDecimals,
@@ -536,9 +546,12 @@ describe("svm_spoke.fill", () => {
536
546
  assertSE(recipientAccount.amount, "0", "Recipient's balance should be 0 before the fill");
537
547
  let relayerAccount = await (0, spl_token_1.getAccount)(connection, relayerTA);
538
548
  assertSE(relayerAccount.amount, seedBalance, "Relayer's balance should be equal to seed balance before the fill");
539
- const relayHash = Array.from((0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId));
549
+ const relayHashUint8Array = (0, web3_v1_1.calculateRelayHashUint8Array)(relayData, chainId);
550
+ const relayHash = Array.from(relayHashUint8Array);
551
+ const delegate = (0, kit_1.address)((0, web3_v1_1.getFillRelayDelegatePda)(relayHashUint8Array, new anchor_1.BN(1), relayer.publicKey, program.programId).pda.toString());
540
552
  const formattedAccounts = {
541
553
  state: (0, kit_1.address)(accounts.state.toString()),
554
+ delegate,
542
555
  instructionParams: (0, kit_1.address)(program.programId.toString()),
543
556
  mint: (0, kit_1.address)(mint.toString()),
544
557
  relayerTokenAccount: (0, kit_1.address)(relayerTA.toString()),
@@ -573,7 +586,7 @@ describe("svm_spoke.fill", () => {
573
586
  const approveIx = (0, token_1.getApproveCheckedInstruction)({
574
587
  source: (0, kit_1.address)(accounts.relayerTokenAccount.toString()),
575
588
  mint: (0, kit_1.address)(accounts.mint.toString()),
576
- delegate: (0, kit_1.address)(accounts.state.toString()),
589
+ delegate,
577
590
  owner: (0, kit_1.address)(accounts.signer.toString()),
578
591
  amount: BigInt(relayData.outputAmount.toString()),
579
592
  decimals: tokenDecimals,
@@ -595,6 +608,7 @@ describe("svm_spoke.fill", () => {
595
608
  const alt = await (0, svm_1.createLookupTable)(rpcClient, signer);
596
609
  const ac = [
597
610
  formattedAccounts.state,
611
+ formattedAccounts.delegate,
598
612
  formattedAccounts.instructionParams,
599
613
  formattedAccounts.mint,
600
614
  formattedAccounts.relayerTokenAccount,
@@ -25,14 +25,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  const anchor = __importStar(require("@coral-xyz/anchor"));
27
27
  const anchor_1 = require("@coral-xyz/anchor");
28
- const spl_token_1 = require("@solana/spl-token");
29
28
  const web3_js_1 = require("@solana/web3.js");
30
29
  const chai_1 = require("chai");
31
30
  const crypto = __importStar(require("crypto"));
32
31
  const ethers_1 = require("ethers");
33
32
  const web3_v1_1 = require("../../src/svm/web3-v1");
34
33
  const SvmSpoke_common_1 = require("./SvmSpoke.common");
35
- const { createRoutePda, getVaultAta, initializeState, crossDomainAdmin, remoteDomain, localDomain } = SvmSpoke_common_1.common;
34
+ const { initializeState, crossDomainAdmin, remoteDomain, localDomain } = SvmSpoke_common_1.common;
36
35
  describe("svm_spoke.handle_receive_message", () => {
37
36
  anchor.setProvider(anchor_1.AnchorProvider.env());
38
37
  const program = anchor_1.workspace.SvmSpoke;
@@ -56,7 +55,6 @@ describe("svm_spoke.handle_receive_message", () => {
56
55
  "function pauseDeposits(bool pause)",
57
56
  "function pauseFills(bool pause)",
58
57
  "function setCrossDomainAdmin(address newCrossDomainAdmin)",
59
- "function setEnableRoute(bytes32 originToken, uint64 destinationChainId, bool enabled)",
60
58
  "function relayRootBundle(bytes32 relayerRefundRoot, bytes32 slowRelayRoot)",
61
59
  "function emergencyDeleteRootBundle(uint256 rootBundleId)",
62
60
  ]);
@@ -297,116 +295,6 @@ describe("svm_spoke.handle_receive_message", () => {
297
295
  let stateData = await program.account.state.fetch(state);
298
296
  chai_1.assert.strictEqual(stateData.crossDomainAdmin.toString(), newCrossDomainAdminPubkey.toString(), "Cross-domain admin should be set");
299
297
  });
300
- it("Enables and disables route remotely", async () => {
301
- // Enable the route.
302
- const originToken = await (0, spl_token_1.createMint)(provider.connection, provider.wallet.payer, owner, owner, 6);
303
- const routeChainId = 1;
304
- let calldata = ethereumIface.encodeFunctionData("setEnableRoute", [originToken.toBuffer(), routeChainId, true]);
305
- let messageBody = Buffer.from(calldata.slice(2), "hex");
306
- let message = (0, web3_v1_1.encodeMessageHeader)({
307
- version: cctpMessageversion,
308
- sourceDomain: remoteDomain.toNumber(),
309
- destinationDomain: localDomain,
310
- nonce: BigInt(nonce),
311
- sender: crossDomainAdmin,
312
- recipient: program.programId,
313
- destinationCaller,
314
- messageBody,
315
- });
316
- // Remaining accounts specific to SetEnableRoute.
317
- const routePda = createRoutePda(originToken, seed, new anchor_1.BN(routeChainId));
318
- const vault = await getVaultAta(originToken, state);
319
- // Same 3 remaining accounts passed for HandleReceiveMessage context.
320
- const enableRouteRemainingAccounts = remainingAccounts.slice(0, 3);
321
- // payer in self-invoked SetEnableRoute.
322
- enableRouteRemainingAccounts.push({
323
- isSigner: true,
324
- isWritable: true,
325
- pubkey: provider.wallet.publicKey,
326
- });
327
- // state in self-invoked SetEnableRoute.
328
- enableRouteRemainingAccounts.push({
329
- isSigner: false,
330
- isWritable: false,
331
- pubkey: state,
332
- });
333
- // route in self-invoked SetEnableRoute.
334
- enableRouteRemainingAccounts.push({
335
- isSigner: false,
336
- isWritable: true,
337
- pubkey: routePda,
338
- });
339
- // vault in self-invoked SetEnableRoute.
340
- enableRouteRemainingAccounts.push({
341
- isSigner: false,
342
- isWritable: true,
343
- pubkey: vault,
344
- });
345
- // origin_token_mint in self-invoked SetEnableRoute.
346
- enableRouteRemainingAccounts.push({
347
- isSigner: false,
348
- isWritable: false,
349
- pubkey: originToken,
350
- });
351
- // token_program in self-invoked SetEnableRoute.
352
- enableRouteRemainingAccounts.push({
353
- isSigner: false,
354
- isWritable: false,
355
- pubkey: spl_token_1.TOKEN_PROGRAM_ID,
356
- });
357
- // associated_token_program in self-invoked SetEnableRoute.
358
- enableRouteRemainingAccounts.push({
359
- isSigner: false,
360
- isWritable: false,
361
- pubkey: spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID,
362
- });
363
- // system_program in self-invoked SetEnableRoute.
364
- enableRouteRemainingAccounts.push({
365
- isSigner: false,
366
- isWritable: false,
367
- pubkey: anchor_1.web3.SystemProgram.programId,
368
- });
369
- // event_authority in self-invoked SetEnableRoute (appended by Anchor with event_cpi macro).
370
- enableRouteRemainingAccounts.push({
371
- isSigner: false,
372
- isWritable: false,
373
- pubkey: eventAuthority,
374
- });
375
- // program in self-invoked SetEnableRoute (appended by Anchor with event_cpi macro).
376
- enableRouteRemainingAccounts.push({
377
- isSigner: false,
378
- isWritable: false,
379
- pubkey: program.programId,
380
- });
381
- await messageTransmitterProgram.methods
382
- .receiveMessage({ message, attestation })
383
- .accounts(receiveMessageAccounts)
384
- .remainingAccounts(enableRouteRemainingAccounts)
385
- .rpc();
386
- let routeAccount = await program.account.route.fetch(routePda);
387
- chai_1.assert.isTrue(routeAccount.enabled, "Route should be enabled");
388
- // Disable the route.
389
- nonce += 1;
390
- calldata = ethereumIface.encodeFunctionData("setEnableRoute", [originToken.toBuffer(), routeChainId, false]);
391
- messageBody = Buffer.from(calldata.slice(2), "hex");
392
- message = (0, web3_v1_1.encodeMessageHeader)({
393
- version: cctpMessageversion,
394
- sourceDomain: remoteDomain.toNumber(),
395
- destinationDomain: localDomain,
396
- nonce: BigInt(nonce),
397
- sender: crossDomainAdmin,
398
- recipient: program.programId,
399
- destinationCaller,
400
- messageBody,
401
- });
402
- await messageTransmitterProgram.methods
403
- .receiveMessage({ message, attestation })
404
- .accounts(receiveMessageAccounts)
405
- .remainingAccounts(enableRouteRemainingAccounts)
406
- .rpc();
407
- routeAccount = await program.account.route.fetch(routePda);
408
- chai_1.assert.isFalse(routeAccount.enabled, "Route should be disabled");
409
- });
410
298
  it("Relays root bundle remotely", async () => {
411
299
  // Encode relayRootBundle message.
412
300
  const relayerRefundRoot = crypto.randomBytes(32);
@@ -431,7 +319,7 @@ describe("svm_spoke.handle_receive_message", () => {
431
319
  const [rootBundle] = anchor_1.web3.PublicKey.findProgramAddressSync(seeds, program.programId);
432
320
  // Same 3 remaining accounts passed for HandleReceiveMessage context.
433
321
  const relayRootBundleRemainingAccounts = remainingAccounts.slice(0, 3);
434
- // payer in self-invoked SetEnableRoute.
322
+ // payer in self-invoked RelayRootBundle.
435
323
  relayRootBundleRemainingAccounts.push({
436
324
  isSigner: true,
437
325
  isWritable: true,
@@ -104,11 +104,11 @@ describe("svm_spoke.slow_fill.across_plus", () => {
104
104
  loadRequestParamsInstructions = await (0, web3_v1_1.loadRequestSlowFillParams)(program, relayer, requestSlowFillValues[1]);
105
105
  [requestAccounts.instructionParams] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("instruction_params"), relayer.publicKey.toBuffer()], program.programId);
106
106
  }
107
- const requestV3SlowFillParams = bufferParams
107
+ const requestSlowFillParams = bufferParams
108
108
  ? [requestSlowFillValues[0], null]
109
109
  : requestSlowFillValues;
110
110
  const requestIx = await program.methods
111
- .requestSlowFill(...requestV3SlowFillParams)
111
+ .requestSlowFill(...requestSlowFillParams)
112
112
  .accounts(requestAccounts)
113
113
  .instruction();
114
114
  const executeAccounts = {