@across-protocol/contracts 3.0.18 → 3.0.19

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 (74) hide show
  1. package/README.md +2 -0
  2. package/artifacts/build-info/9cb910e5bb5dd730cd01af84a0fb0466.json +1 -0
  3. package/artifacts/contracts/Ink_SpokePool.sol/Ink_SpokePool.dbg.json +4 -0
  4. package/artifacts/contracts/Ink_SpokePool.sol/Ink_SpokePool.json +2316 -0
  5. package/contracts/Ink_SpokePool.sol +72 -0
  6. package/dist/deploy/consts.js +8 -2
  7. package/dist/deployments/deployments.json +7 -1
  8. package/dist/hardhat.config.js +17 -0
  9. package/dist/scripts/svm/addressToPublicKey.js +2 -2
  10. package/dist/scripts/svm/bridgeLiabilityToHubPool.d.ts +1 -4
  11. package/dist/scripts/svm/bridgeLiabilityToHubPool.js +5 -15
  12. package/dist/scripts/svm/closeRelayerPdas.js +3 -3
  13. package/dist/scripts/svm/executeRebalanceToHubPool.d.ts +1 -4
  14. package/dist/scripts/svm/executeRebalanceToHubPool.js +6 -16
  15. package/dist/scripts/svm/executeRebalanceToSpokePool.js +14 -27
  16. package/dist/scripts/svm/fakeFillWithRandomDistribution.js +6 -7
  17. package/dist/scripts/svm/initialize.js +2 -2
  18. package/dist/scripts/svm/proposeRebalanceToSpokePool.js +11 -15
  19. package/dist/scripts/svm/publicKeyToAddress.js +2 -2
  20. package/dist/scripts/svm/queryDeposits.js +2 -2
  21. package/dist/scripts/svm/queryFills.js +10 -11
  22. package/dist/scripts/svm/remoteHubPoolPauseDeposits.js +10 -24
  23. package/dist/scripts/svm/remoteHubPoolSetDepositRoute.js +16 -29
  24. package/dist/scripts/svm/remotePauseDeposits.js +21 -27
  25. package/dist/scripts/svm/simpleFakeRelayerRepayment.js +3 -3
  26. package/dist/scripts/svm/simpleFill.js +3 -4
  27. package/dist/scripts/svm/utils/helpers.d.ts +3 -1
  28. package/dist/scripts/svm/utils/helpers.js +13 -3
  29. package/dist/src/svm/coders.d.ts +37 -0
  30. package/dist/src/svm/coders.js +250 -0
  31. package/dist/src/svm/conversionUtils.d.ts +22 -0
  32. package/dist/src/svm/conversionUtils.js +73 -0
  33. package/dist/src/svm/index.d.ts +6 -0
  34. package/dist/src/svm/index.js +22 -0
  35. package/dist/src/svm/instructionParamsUtils.d.ts +31 -0
  36. package/dist/src/svm/instructionParamsUtils.js +128 -0
  37. package/dist/src/svm/relayHashUtils.d.ts +30 -0
  38. package/dist/src/svm/relayHashUtils.js +209 -0
  39. package/dist/src/svm/solanaProgramUtils.d.ts +38 -0
  40. package/dist/src/svm/solanaProgramUtils.js +147 -0
  41. package/dist/src/svm/transactionUtils.d.ts +8 -0
  42. package/dist/src/svm/transactionUtils.js +55 -0
  43. package/dist/src/types/svm.d.ts +118 -0
  44. package/dist/src/types/svm.js +2 -0
  45. package/dist/test/svm/MulticallHandler.js +2 -2
  46. package/dist/test/svm/SvmSpoke.Bundle.js +48 -48
  47. package/dist/test/svm/SvmSpoke.Deposit.js +13 -13
  48. package/dist/test/svm/SvmSpoke.Fill.AcrossPlus.js +15 -17
  49. package/dist/test/svm/SvmSpoke.Fill.js +29 -30
  50. package/dist/test/svm/SvmSpoke.HandleReceiveMessage.js +2 -2
  51. package/dist/test/svm/SvmSpoke.Ownership.js +6 -6
  52. package/dist/test/svm/SvmSpoke.RefundClaims.js +5 -5
  53. package/dist/test/svm/SvmSpoke.Routes.js +3 -3
  54. package/dist/test/svm/SvmSpoke.SlowFill.AcrossPlus.js +19 -20
  55. package/dist/test/svm/SvmSpoke.SlowFill.js +18 -18
  56. package/dist/test/svm/SvmSpoke.TokenBridge.js +13 -13
  57. package/dist/test/svm/SvmSpoke.common.d.ts +1 -49
  58. package/dist/test/svm/SvmSpoke.common.js +4 -4
  59. package/dist/test/svm/cctpHelpers.js +2 -2
  60. package/dist/test/svm/utils.d.ts +5 -66
  61. package/dist/test/svm/utils.js +10 -226
  62. package/dist/typechain/contracts/Ink_SpokePool.d.ts +1251 -0
  63. package/dist/typechain/contracts/Ink_SpokePool.js +2 -0
  64. package/dist/typechain/contracts/index.d.ts +1 -0
  65. package/dist/typechain/factories/contracts/Ink_SpokePool__factory.d.ts +1833 -0
  66. package/dist/typechain/factories/contracts/Ink_SpokePool__factory.js +2347 -0
  67. package/dist/typechain/factories/contracts/index.d.ts +1 -0
  68. package/dist/typechain/factories/contracts/index.js +3 -1
  69. package/dist/typechain/hardhat.d.ts +9 -0
  70. package/dist/typechain/index.d.ts +2 -0
  71. package/dist/typechain/index.js +5 -3
  72. package/package.json +2 -2
  73. package/dist/src/SvmUtils.d.ts +0 -72
  74. package/dist/src/SvmUtils.js +0 -496
@@ -32,8 +32,7 @@ const anchor_1 = require("@coral-xyz/anchor");
32
32
  const web3_js_1 = require("@solana/web3.js");
33
33
  const yargs_1 = __importDefault(require("yargs"));
34
34
  const helpers_1 = require("yargs/helpers");
35
- const SvmUtils_1 = require("../../src/SvmUtils");
36
- const utils_1 = require("../../test/svm/utils");
35
+ const svm_1 = require("../../src/svm");
37
36
  // Set up the provider
38
37
  const provider = anchor_1.AnchorProvider.env();
39
38
  anchor.setProvider(provider);
@@ -57,7 +56,7 @@ async function queryFills() {
57
56
  { Property: "statePda", Value: statePda.toString() },
58
57
  ]);
59
58
  try {
60
- const events = await (0, SvmUtils_1.readProgramEvents)(provider.connection, program);
59
+ const events = await (0, svm_1.readProgramEvents)(provider.connection, program);
61
60
  const fillEvents = events.filter((event) => event.name === "filledV3Relay");
62
61
  if (fillEvents.length === 0) {
63
62
  console.log("No fill events found for the given seed.");
@@ -67,22 +66,22 @@ async function queryFills() {
67
66
  fillEvents.forEach((event, index) => {
68
67
  console.log(`Fill Event ${index + 1}:`);
69
68
  console.table([
70
- { Property: "inputToken", Value: (0, SvmUtils_1.strPublicKey)(event.data.inputToken) },
71
- { Property: "outputToken", Value: (0, SvmUtils_1.strPublicKey)(event.data.outputToken) },
69
+ { Property: "inputToken", Value: (0, svm_1.strPublicKey)(event.data.inputToken) },
70
+ { Property: "outputToken", Value: (0, svm_1.strPublicKey)(event.data.outputToken) },
72
71
  { Property: "inputAmount", Value: event.data.inputAmount.toString() },
73
72
  { Property: "outputAmount", Value: event.data.outputAmount.toString() },
74
73
  { Property: "repaymentChainId", Value: event.data.repaymentChainId.toString() },
75
74
  { Property: "originChainId", Value: event.data.originChainId.toString() },
76
75
  { Property: "depositId", Value: event.data.depositId.toString() },
77
- { Property: "depositIdNum", Value: (0, utils_1.u8Array32ToInt)(event.data.depositId).toString() },
76
+ { Property: "depositIdNum", Value: (0, svm_1.u8Array32ToInt)(event.data.depositId).toString() },
78
77
  { Property: "fillDeadline", Value: event.data.fillDeadline.toString() },
79
78
  { Property: "exclusivityDeadline", Value: event.data.exclusivityDeadline.toString() },
80
- { Property: "exclusiveRelayer", Value: (0, SvmUtils_1.strPublicKey)(event.data.exclusiveRelayer) },
81
- { Property: "relayer", Value: (0, SvmUtils_1.strPublicKey)(event.data.relayer) },
82
- { Property: "depositor", Value: (0, SvmUtils_1.strPublicKey)(event.data.depositor) },
83
- { Property: "recipient", Value: (0, SvmUtils_1.strPublicKey)(event.data.recipient) },
79
+ { Property: "exclusiveRelayer", Value: (0, svm_1.strPublicKey)(event.data.exclusiveRelayer) },
80
+ { Property: "relayer", Value: (0, svm_1.strPublicKey)(event.data.relayer) },
81
+ { Property: "depositor", Value: (0, svm_1.strPublicKey)(event.data.depositor) },
82
+ { Property: "recipient", Value: (0, svm_1.strPublicKey)(event.data.recipient) },
84
83
  { Property: "messageHash", Value: event.data.messageHash.toString() },
85
- { Property: "updatedRecipient", Value: (0, SvmUtils_1.strPublicKey)(event.data.relayExecutionInfo.updatedRecipient) },
84
+ { Property: "updatedRecipient", Value: (0, svm_1.strPublicKey)(event.data.relayExecutionInfo.updatedRecipient) },
86
85
  { Property: "updatedMessageHash", Value: event.data.relayExecutionInfo.updatedMessageHash.toString() },
87
86
  { Property: "updatedOutputAmount", Value: event.data.relayExecutionInfo.updatedOutputAmount.toString() },
88
87
  { Property: "fillType", Value: event.data.relayExecutionInfo.fillType },
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // This script bridges remote call to pause deposits on Solana Spoke Pool. Required environment:
3
- // - ETHERS_PROVIDER_URL: Ethereum RPC provider URL.
4
- // - ETHERS_MNEMONIC: Mnemonic of the wallet that will sign the sending transaction on Ethereum
3
+ // - NODE_URL_${CHAIN_ID}: Ethereum RPC URL (must point to the Mainnet or Sepolia depending on Solana cluster).
4
+ // - MNEMONIC: Mnemonic of the wallet that will sign the sending transaction on Ethereum
5
5
  // - HUB_POOL_ADDRESS: Hub Pool address
6
6
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
7
  if (k2 === undefined) k2 = k;
@@ -37,9 +37,11 @@ require("dotenv/config");
37
37
  const ethers_1 = require("ethers");
38
38
  const yargs_1 = __importDefault(require("yargs"));
39
39
  const helpers_1 = require("yargs/helpers");
40
+ const common_1 = require("@uma/common");
40
41
  const cctpHelpers_1 = require("../../test/svm/cctpHelpers");
41
42
  const typechain_1 = require("../../typechain");
42
43
  const constants_1 = require("./utils/constants");
44
+ const helpers_2 = require("./utils/helpers");
43
45
  // Set up Solana provider.
44
46
  const provider = anchor_1.AnchorProvider.env();
45
47
  anchor.setProvider(provider);
@@ -54,28 +56,12 @@ async function remoteHubPoolPauseDeposit() {
54
56
  const seed = new anchor_1.BN(0);
55
57
  const resumeRemoteTx = resolvedArgv.resumeRemoteTx;
56
58
  const pause = resolvedArgv.pause;
57
- // Set up Ethereum provider.
58
- if (!process.env.ETHERS_PROVIDER_URL) {
59
- throw new Error("Environment variable ETHERS_PROVIDER_URL is not set");
60
- }
61
- const ethersProvider = new ethers_1.ethers.providers.JsonRpcProvider(process.env.ETHERS_PROVIDER_URL);
62
- if (!process.env.ETHERS_MNEMONIC) {
63
- throw new Error("Environment variable ETHERS_MNEMONIC is not set");
64
- }
65
- const ethersSigner = ethers_1.ethers.Wallet.fromMnemonic(process.env.ETHERS_MNEMONIC).connect(ethersProvider);
66
- if (!process.env.HUB_POOL_ADDRESS) {
67
- throw new Error("Environment variable HUB_POOL_ADDRESS is not set");
68
- }
69
- const hubPoolAddress = process.env.HUB_POOL_ADDRESS;
70
- let cluster;
71
- const rpcEndpoint = provider.connection.rpcEndpoint;
72
- if (rpcEndpoint.includes("devnet"))
73
- cluster = "devnet";
74
- else if (rpcEndpoint.includes("mainnet"))
75
- cluster = "mainnet";
76
- else
77
- throw new Error(`Unsupported cluster endpoint: ${rpcEndpoint}`);
78
- const isDevnet = cluster == "devnet";
59
+ // Set up Ethereum provider and signer.
60
+ const isDevnet = (0, helpers_2.isSolanaDevnet)(provider);
61
+ const nodeURL = isDevnet ? (0, common_1.getNodeUrl)("sepolia", true) : (0, common_1.getNodeUrl)("mainnet", true);
62
+ const ethersProvider = new ethers_1.ethers.providers.JsonRpcProvider(nodeURL);
63
+ const ethersSigner = ethers_1.ethers.Wallet.fromMnemonic((0, helpers_2.requireEnv)("MNEMONIC")).connect(ethersProvider);
64
+ const hubPoolAddress = (0, helpers_2.requireEnv)("HUB_POOL_ADDRESS");
79
65
  // CCTP domains.
80
66
  const remoteDomain = 0; // Ethereum
81
67
  // Get Solana programs and accounts.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // This script bridges remote call to pause deposits on Solana Spoke Pool. Required environment:
3
- // - ETHERS_PROVIDER_URL: Ethereum RPC provider URL.
4
- // - ETHERS_MNEMONIC: Mnemonic of the wallet that will sign the sending transaction on Ethereum
3
+ // - NODE_URL_${CHAIN_ID}: Ethereum RPC URL (must point to the Mainnet or Sepolia depending on Solana cluster).
4
+ // - MNEMONIC: Mnemonic of the wallet that will sign the sending transaction on Ethereum
5
5
  // - HUB_POOL_ADDRESS: Hub Pool address
6
6
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
7
  if (k2 === undefined) k2 = k;
@@ -37,11 +37,13 @@ const web3_js_1 = require("@solana/web3.js");
37
37
  const yargs_1 = __importDefault(require("yargs"));
38
38
  const helpers_1 = require("yargs/helpers");
39
39
  const ethers_1 = require("ethers");
40
+ const common_1 = require("@uma/common");
40
41
  const cctpHelpers_1 = require("../../test/svm/cctpHelpers");
41
42
  const typechain_1 = require("../../typechain");
42
43
  const spl_token_1 = require("@solana/spl-token");
43
44
  const constants_1 = require("./utils/constants");
44
45
  const helpers_2 = require("./utils/helpers");
46
+ const constants_2 = require("../../utils/constants");
45
47
  // Set up Solana provider.
46
48
  const provider = anchor_1.AnchorProvider.env();
47
49
  anchor.setProvider(provider);
@@ -58,28 +60,12 @@ async function remoteHubPoolSetDepositRoute() {
58
60
  const depositsEnabled = resolvedArgv.depositsEnabled;
59
61
  const seed = new anchor_1.BN(0);
60
62
  const resumeRemoteTx = resolvedArgv.resumeRemoteTx;
61
- // Set up Ethereum provider.
62
- if (!process.env.ETHERS_PROVIDER_URL) {
63
- throw new Error("Environment variable ETHERS_PROVIDER_URL is not set");
64
- }
65
- const ethersProvider = new ethers_1.ethers.providers.JsonRpcProvider(process.env.ETHERS_PROVIDER_URL);
66
- if (!process.env.ETHERS_MNEMONIC) {
67
- throw new Error("Environment variable ETHERS_MNEMONIC is not set");
68
- }
69
- const ethersSigner = ethers_1.ethers.Wallet.fromMnemonic(process.env.ETHERS_MNEMONIC).connect(ethersProvider);
70
- if (!process.env.HUB_POOL_ADDRESS) {
71
- throw new Error("Environment variable HUB_POOL_ADDRESS is not set");
72
- }
73
- const hubPoolAddress = process.env.HUB_POOL_ADDRESS;
74
- let cluster;
75
- const rpcEndpoint = provider.connection.rpcEndpoint;
76
- if (rpcEndpoint.includes("devnet"))
77
- cluster = "devnet";
78
- else if (rpcEndpoint.includes("mainnet"))
79
- cluster = "mainnet";
80
- else
81
- throw new Error(`Unsupported cluster endpoint: ${rpcEndpoint}`);
82
- const isDevnet = cluster == "devnet";
63
+ // Set up Ethereum provider and signer.
64
+ const isDevnet = (0, helpers_2.isSolanaDevnet)(provider);
65
+ const nodeURL = isDevnet ? (0, common_1.getNodeUrl)("sepolia", true) : (0, common_1.getNodeUrl)("mainnet", true);
66
+ const ethersProvider = new ethers_1.ethers.providers.JsonRpcProvider(nodeURL);
67
+ const ethersSigner = ethers_1.ethers.Wallet.fromMnemonic((0, helpers_2.requireEnv)("MNEMONIC")).connect(ethersProvider);
68
+ const hubPoolAddress = (0, helpers_2.requireEnv)("HUB_POOL_ADDRESS");
83
69
  const usdcProgramId = isDevnet ? constants_1.SOLANA_USDC_DEVNET : constants_1.SOLANA_USDC_MAINNET;
84
70
  const originToken = new web3_js_1.PublicKey(usdcProgramId);
85
71
  const originTokenAddress = (0, helpers_2.fromBytes32ToAddress)((0, helpers_2.fromBase58ToBytes32)(originToken.toBase58()));
@@ -103,16 +89,17 @@ async function remoteHubPoolSetDepositRoute() {
103
89
  const [selfAuthority] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("self_authority")], svmSpokeProgram.programId);
104
90
  const [eventAuthority] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("__event_authority")], svmSpokeProgram.programId);
105
91
  const irisApiUrl = isDevnet ? constants_1.CIRCLE_IRIS_API_URL_DEVNET : constants_1.CIRCLE_IRIS_API_URL_MAINNET;
106
- const supportedChainId = isDevnet ? 11155111 : 1; // Sepolia is bridged to devnet, Ethereum to mainnet in CCTP.
107
- const chainId = (await ethersProvider.getNetwork()).chainId;
108
- if (chainId !== supportedChainId) {
109
- throw new Error(`Chain ID ${chainId} does not match expected Solana cluster ${cluster}`);
92
+ const solanaCluster = isDevnet ? "devnet" : "mainnet";
93
+ const supportedEvmChainId = isDevnet ? constants_2.CHAIN_IDs.SEPOLIA : constants_2.CHAIN_IDs.MAINNET; // Sepolia is bridged to devnet, Ethereum to mainnet in CCTP.
94
+ const evmChainId = (await ethersProvider.getNetwork()).chainId;
95
+ if (evmChainId !== supportedEvmChainId) {
96
+ throw new Error(`Chain ID ${evmChainId} does not match expected Solana cluster ${solanaCluster}`);
110
97
  }
111
98
  const hubPool = typechain_1.HubPool__factory.connect(hubPoolAddress, ethersProvider);
112
99
  console.log("Remotely configuring deposit route...");
113
100
  console.table([
114
101
  { Property: "seed", Value: seed.toString() },
115
- { Property: "chainId", Value: chainId.toString() },
102
+ { Property: "evmChainId", Value: evmChainId.toString() },
116
103
  { Property: "originChainId", Value: originChainId },
117
104
  { Property: "destinationChainId", Value: destinationChainId },
118
105
  { Property: "depositsEnabled", Value: depositsEnabled },
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // This script bridges remote call to pause deposits on Solana Spoke Pool. Required environment:
3
- // - ETHERS_PROVIDER_URL: Ethereum RPC provider URL.
4
- // - ETHERS_MNEMONIC: Mnemonic of the wallet that will sign the sending transaction on Ethereum
3
+ // - NODE_URL_${CHAIN_ID}: Ethereum RPC URL (must point to the Mainnet or Sepolia depending on Solana cluster).
4
+ // - MNEMONIC: Mnemonic of the wallet that will sign the sending transaction on Ethereum
5
5
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
6
  if (k2 === undefined) k2 = k;
7
7
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -36,7 +36,11 @@ const web3_js_1 = require("@solana/web3.js");
36
36
  const yargs_1 = __importDefault(require("yargs"));
37
37
  const helpers_1 = require("yargs/helpers");
38
38
  const ethers_1 = require("ethers");
39
+ const common_1 = require("@uma/common");
39
40
  const cctpHelpers_1 = require("../../test/svm/cctpHelpers");
41
+ const helpers_2 = require("./utils/helpers");
42
+ const constants_1 = require("./utils/constants");
43
+ const constants_2 = require("../../utils/constants");
40
44
  // Set up Solana provider.
41
45
  const provider = anchor_1.AnchorProvider.env();
42
46
  anchor.setProvider(provider);
@@ -59,15 +63,11 @@ async function remotePauseDeposits() {
59
63
  const seed = new anchor_1.BN(resolvedArgv.seed);
60
64
  const pause = resolvedArgv.pause;
61
65
  const resumeRemoteTx = resolvedArgv.resumeRemoteTx;
62
- // Set up Ethereum provider.
63
- if (!process.env.ETHERS_PROVIDER_URL) {
64
- throw new Error("Environment variable ETHERS_PROVIDER_URL is not set");
65
- }
66
- const ethersProvider = new ethers_1.ethers.providers.JsonRpcProvider(process.env.ETHERS_PROVIDER_URL);
67
- if (!process.env.ETHERS_MNEMONIC) {
68
- throw new Error("Environment variable ETHERS_MNEMONIC is not set");
69
- }
70
- const ethersSigner = ethers_1.ethers.Wallet.fromMnemonic(process.env.ETHERS_MNEMONIC).connect(ethersProvider);
66
+ // Set up Ethereum provider and signer.
67
+ const isDevnet = (0, helpers_2.isSolanaDevnet)(provider);
68
+ const nodeURL = isDevnet ? (0, common_1.getNodeUrl)("sepolia", true) : (0, common_1.getNodeUrl)("mainnet", true);
69
+ const ethersProvider = new ethers_1.ethers.providers.JsonRpcProvider(nodeURL);
70
+ const ethersSigner = ethers_1.ethers.Wallet.fromMnemonic((0, helpers_2.requireEnv)("MNEMONIC")).connect(ethersProvider);
71
71
  // CCTP domains.
72
72
  const remoteDomain = 0; // Ethereum
73
73
  const localDomain = 5; // Solana
@@ -81,33 +81,27 @@ async function remotePauseDeposits() {
81
81
  const [authorityPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("message_transmitter_authority"), svmSpokeProgram.programId.toBuffer()], messageTransmitterProgram.programId);
82
82
  const [selfAuthority] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("self_authority")], svmSpokeProgram.programId);
83
83
  const [eventAuthority] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("__event_authority")], svmSpokeProgram.programId);
84
- let cluster;
85
- const rpcEndpoint = provider.connection.rpcEndpoint;
86
- if (rpcEndpoint.includes("devnet"))
87
- cluster = "devnet";
88
- else if (rpcEndpoint.includes("mainnet"))
89
- cluster = "mainnet";
90
- else
91
- throw new Error(`Unsupported cluster endpoint: ${rpcEndpoint}`);
92
- const irisApiUrl = cluster == "devnet" ? "https://iris-api-sandbox.circle.com" : "https://iris-api.circle.com";
93
- const supportedChainId = cluster == "devnet" ? 11155111 : 1; // Sepolia is bridged to devnet, Ethereum to mainnet in CCTP.
94
- const chainId = (await ethersProvider.getNetwork()).chainId;
95
- // TODO: improve type casting.
96
- if (chainId !== BigInt(supportedChainId)) {
97
- throw new Error(`Chain ID ${chainId} does not match expected Solana cluster ${cluster}`);
84
+ const solanaCluster = isDevnet ? "devnet" : "mainnet";
85
+ const irisApiUrl = isDevnet ? constants_1.CIRCLE_IRIS_API_URL_DEVNET : constants_1.CIRCLE_IRIS_API_URL_MAINNET;
86
+ const supportedEvmChainId = isDevnet ? constants_2.CHAIN_IDs.SEPOLIA : constants_2.CHAIN_IDs.MAINNET; // Sepolia is bridged to devnet, Ethereum to mainnet in CCTP.
87
+ const evmChainId = (await ethersProvider.getNetwork()).chainId;
88
+ if (evmChainId !== supportedEvmChainId) {
89
+ throw new Error(`Chain ID ${evmChainId} does not match expected Solana cluster ${solanaCluster}`);
98
90
  }
99
91
  const messageTransmitterRemoteIface = new ethers_1.ethers.utils.Interface([
100
92
  "function sendMessage(uint32 destinationDomain, bytes32 recipient, bytes messageBody)",
101
93
  "event MessageSent(bytes message)",
102
94
  ]);
103
95
  // CCTP MessageTransmitter from https://developers.circle.com/stablecoins/docs/evm-smart-contracts
104
- const messageTransmitterRemoteAddress = cluster == "devnet" ? "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD" : "0x0a992d191deec32afe36203ad87d7d289a738f81";
96
+ const messageTransmitterRemoteAddress = isDevnet
97
+ ? constants_1.SEPOLIA_CCTP_MESSAGE_TRANSMITTER_ADDRESS
98
+ : constants_1.MAINNET_CCTP_MESSAGE_TRANSMITTER_ADDRESS;
105
99
  const messageTransmitterRemote = new ethers_1.ethers.Contract(messageTransmitterRemoteAddress, messageTransmitterRemoteIface, ethersSigner);
106
100
  const spokePoolIface = new ethers_1.ethers.utils.Interface(["function pauseDeposits(bool pause)"]);
107
101
  console.log("Remotely controlling pausedDeposits...");
108
102
  console.table([
109
103
  { Property: "seed", Value: seed.toString() },
110
- { Property: "chainId", Value: chainId.toString() },
104
+ { Property: "evmChainId", Value: evmChainId.toString() },
111
105
  { Property: "pause", Value: pause },
112
106
  { Property: "svmSpokeProgramProgramId", Value: svmSpokeProgram.programId.toString() },
113
107
  { Property: "providerPublicKey", Value: provider.wallet.publicKey.toString() },
@@ -34,7 +34,7 @@ const spl_token_1 = require("@solana/spl-token");
34
34
  const yargs_1 = __importDefault(require("yargs"));
35
35
  const helpers_1 = require("yargs/helpers");
36
36
  const MerkleTree_1 = require("@uma/common/dist/MerkleTree");
37
- const utils_1 = require("../../test/svm/utils");
37
+ const svm_1 = require("../../src/svm");
38
38
  // Set up the provider
39
39
  const provider = anchor_1.AnchorProvider.env();
40
40
  anchor.setProvider(provider);
@@ -121,7 +121,7 @@ async function testBundleLogic() {
121
121
  refundAddresses, // Array of refund authority addresses
122
122
  refundAmounts: amounts, // Array of amounts
123
123
  };
124
- const merkleTree = new MerkleTree_1.MerkleTree([relayerRefundLeaf], utils_1.relayerRefundHashFn);
124
+ const merkleTree = new MerkleTree_1.MerkleTree([relayerRefundLeaf], svm_1.relayerRefundHashFn);
125
125
  const root = merkleTree.getRoot();
126
126
  console.log("Merkle Tree Generated. Root: ", Buffer.from(root).toString("hex"));
127
127
  // Set the tree using the methods from the .Bundle test
@@ -197,7 +197,7 @@ async function testBundleLogic() {
197
197
  if (!lookupTableAccount) {
198
198
  throw new Error("AddressLookupTableAccount not fetched");
199
199
  }
200
- await (0, utils_1.loadExecuteRelayerRefundLeafParams)(program, signer.publicKey, rootBundleId, leaf, proofAsNumbers);
200
+ await (0, svm_1.loadExecuteRelayerRefundLeafParams)(program, signer.publicKey, rootBundleId, leaf, proofAsNumbers);
201
201
  console.log(`loaded execute relayer refund leaf params ${instructionParams}. \nExecuting relayer refund leaf...`);
202
202
  const executeInstruction = await program.methods
203
203
  .executeRelayerRefundLeaf()
@@ -34,8 +34,7 @@ const web3_js_1 = require("@solana/web3.js");
34
34
  const spl_token_1 = require("@solana/spl-token");
35
35
  const yargs_1 = __importDefault(require("yargs"));
36
36
  const helpers_1 = require("yargs/helpers");
37
- const SvmUtils_1 = require("../../src/SvmUtils");
38
- const utils_1 = require("../../test/svm/utils");
37
+ const svm_1 = require("../../src/svm");
39
38
  // Set up the provider
40
39
  const provider = anchor_1.AnchorProvider.env();
41
40
  anchor.setProvider(provider);
@@ -66,7 +65,7 @@ async function fillV3Relay() {
66
65
  const inputAmount = new anchor_1.BN(resolvedArgv.inputAmount);
67
66
  const outputAmount = new anchor_1.BN(resolvedArgv.outputAmount);
68
67
  const originChainId = new anchor_1.BN(resolvedArgv.originChainId);
69
- const depositId = (0, utils_1.intToU8Array32)(new anchor_1.BN(resolvedArgv.depositId));
68
+ const depositId = (0, svm_1.intToU8Array32)(new anchor_1.BN(resolvedArgv.depositId));
70
69
  const fillDeadline = resolvedArgv.fillDeadline || Math.floor(Date.now() / 1000) + 60; // Current time + 1 minute
71
70
  const exclusivityDeadline = resolvedArgv.exclusivityDeadline || Math.floor(Date.now() / 1000) + 30; // Current time + 30 seconds
72
71
  const message = Buffer.from("");
@@ -93,7 +92,7 @@ async function fillV3Relay() {
93
92
  // Fetch the state from the on-chain program to get chainId
94
93
  const state = await program.account.state.fetch(statePda);
95
94
  const chainId = new anchor_1.BN(state.chainId);
96
- const relayHashUint8Array = (0, SvmUtils_1.calculateRelayHashUint8Array)(relayData, chainId);
95
+ const relayHashUint8Array = (0, svm_1.calculateRelayHashUint8Array)(relayData, chainId);
97
96
  // Define the fill status account PDA
98
97
  const [fillStatusPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("fills"), relayHashUint8Array], programId);
99
98
  // Create ATA for the relayer and recipient token accounts
@@ -1,9 +1,11 @@
1
- import { RelayerRefundLeafSolana, RelayerRefundLeafType } from "../../../test/svm/utils";
1
+ import { AnchorProvider } from "@coral-xyz/anchor";
2
2
  import { BigNumber } from "ethers";
3
3
  import { PublicKey } from "@solana/web3.js";
4
4
  import { MerkleTree } from "@uma/common";
5
+ import { RelayerRefundLeafSolana, RelayerRefundLeafType } from "../../../src/types/svm";
5
6
  export declare const requireEnv: (name: string) => string;
6
7
  export declare const getSolanaChainId: (cluster: "devnet" | "mainnet") => BigNumber;
8
+ export declare const isSolanaDevnet: (provider: AnchorProvider) => boolean;
7
9
  export declare const formatUsdc: (amount: BigNumber) => string;
8
10
  export declare const fromBase58ToBytes32: (input: string) => string;
9
11
  export declare const fromBytes32ToAddress: (input: string) => string;
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.constructSimpleRebalanceTreeToHubPool = exports.fromBytes32ToAddress = exports.fromBase58ToBytes32 = exports.formatUsdc = exports.getSolanaChainId = exports.requireEnv = void 0;
3
+ exports.constructSimpleRebalanceTreeToHubPool = exports.fromBytes32ToAddress = exports.fromBase58ToBytes32 = exports.formatUsdc = exports.isSolanaDevnet = exports.getSolanaChainId = exports.requireEnv = void 0;
4
4
  exports.constructEmptyPoolRebalanceTree = constructEmptyPoolRebalanceTree;
5
5
  const anchor_1 = require("@coral-xyz/anchor");
6
- const utils_1 = require("../../../test/svm/utils");
7
6
  const ethers_1 = require("ethers");
8
7
  const web3_js_1 = require("@solana/web3.js");
9
8
  const common_1 = require("@uma/common");
9
+ const svm_1 = require("../../../src/svm");
10
10
  const requireEnv = (name) => {
11
11
  if (!process.env[name])
12
12
  throw new Error(`Environment variable ${name} is not set`);
@@ -17,6 +17,16 @@ const getSolanaChainId = (cluster) => {
17
17
  return ethers_1.BigNumber.from(BigInt(ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.toUtf8Bytes(`solana-${cluster}`))) & BigInt("0xFFFFFFFFFFFFFFFF"));
18
18
  };
19
19
  exports.getSolanaChainId = getSolanaChainId;
20
+ const isSolanaDevnet = (provider) => {
21
+ const solanaRpcEndpoint = provider.connection.rpcEndpoint;
22
+ if (solanaRpcEndpoint.includes("devnet"))
23
+ return true;
24
+ else if (solanaRpcEndpoint.includes("mainnet"))
25
+ return false;
26
+ else
27
+ throw new Error(`Unsupported solanaCluster endpoint: ${solanaRpcEndpoint}`);
28
+ };
29
+ exports.isSolanaDevnet = isSolanaDevnet;
20
30
  const formatUsdc = (amount) => {
21
31
  return ethers_1.ethers.utils.formatUnits(amount, 6);
22
32
  };
@@ -64,7 +74,7 @@ const constructSimpleRebalanceTreeToHubPool = (netSendAmount, solanaChainId, svm
64
74
  refundAddresses: [],
65
75
  refundAmounts: [],
66
76
  });
67
- const merkleTree = new common_1.MerkleTree(relayerRefundLeaves, utils_1.relayerRefundHashFn);
77
+ const merkleTree = new common_1.MerkleTree(relayerRefundLeaves, svm_1.relayerRefundHashFn);
68
78
  return { merkleTree, leaves: relayerRefundLeaves };
69
79
  };
70
80
  exports.constructSimpleRebalanceTreeToHubPool = constructSimpleRebalanceTreeToHubPool;
@@ -0,0 +1,37 @@
1
+ import { BorshAccountsCoder } from "@coral-xyz/anchor";
2
+ import { Message, PublicKey, TransactionInstruction } from "@solana/web3.js";
3
+ import { AcrossPlusMessage } from "../types/svm";
4
+ /**
5
+ * Extended Anchor accounts coder to handle large account data.
6
+ */
7
+ export declare class LargeAccountsCoder<A extends string = string> extends BorshAccountsCoder<A> {
8
+ private getAccountLayouts;
9
+ encode<T = any>(accountName: A, account: T): Promise<Buffer>;
10
+ }
11
+ /**
12
+ * Helper to encode MulticallHandler transactions.
13
+ */
14
+ export declare class MulticallHandlerCoder {
15
+ readonly compiledMessage: Message;
16
+ private readonly layout;
17
+ constructor(instructions: TransactionInstruction[], payerKey?: PublicKey);
18
+ private static coderArg;
19
+ private static coderTypes;
20
+ get readOnlyLen(): number;
21
+ get compiledKeyMetas(): {
22
+ pubkey: PublicKey;
23
+ isSigner: boolean;
24
+ isWritable: boolean;
25
+ }[];
26
+ encode(): Buffer;
27
+ }
28
+ /**
29
+ * Helper to encode Across+ messages.
30
+ */
31
+ export declare class AcrossPlusMessageCoder {
32
+ private acrossPlusMessage;
33
+ constructor(acrossPlusMessage: AcrossPlusMessage);
34
+ private static coderArg;
35
+ private static coderTypes;
36
+ encode(): Buffer;
37
+ }