|
| 1 | +import assert from "assert"; |
| 2 | +import { HardhatRuntimeEnvironment } from "hardhat/types"; |
| 3 | +import { DeployFunction } from "hardhat-deploy/types"; |
| 4 | +import { USDC, L1_ADDRESS_MAP } from "./consts"; |
| 5 | +import { |
| 6 | + fromBase58ToBytes32, |
| 7 | + getSolanaChainId, |
| 8 | + SOLANA_USDC_MAINNET, |
| 9 | + SOLANA_USDC_DEVNET, |
| 10 | + SOLANA_SPOKE_STATE_SEED, |
| 11 | +} from "../src/svm/web3-v1"; |
| 12 | +import { getDeployedAddress } from "../src/DeploymentUtils"; |
| 13 | +import { PublicKey } from "@solana/web3.js"; |
| 14 | +import { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from "@solana/spl-token"; |
| 15 | + |
| 16 | +/** |
| 17 | + * Note: |
| 18 | + * This adapter supports only USDC for Solana mapping EVM sepolia to SVM devnet and EVM mainnet to SVM mainnet. |
| 19 | + * |
| 20 | + * Usage: |
| 21 | + * $ yarn hardhat deploy --network mainnet --tags solanaAdapter |
| 22 | + */ |
| 23 | + |
| 24 | +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { |
| 25 | + assert(hre.network.name === "mainnet" || hre.network.name === "sepolia", "EVM network must be mainnet or sepolia"); |
| 26 | + const solanaCluster = hre.network.name === "mainnet" ? "mainnet" : "devnet"; |
| 27 | + const svmChainId = getSolanaChainId(solanaCluster).toString(); |
| 28 | + |
| 29 | + const svmSpokePool = getDeployedAddress("SvmSpoke", svmChainId); |
| 30 | + assert(svmSpokePool !== undefined, "SvmSpoke program not deployed for the selected cluster"); |
| 31 | + |
| 32 | + const solanaUsdc = solanaCluster === "mainnet" ? SOLANA_USDC_MAINNET : SOLANA_USDC_DEVNET; |
| 33 | + const [statePda, _] = PublicKey.findProgramAddressSync( |
| 34 | + [Buffer.from("state"), SOLANA_SPOKE_STATE_SEED.toArrayLike(Buffer, "le", 8)], |
| 35 | + new PublicKey(svmSpokePool) |
| 36 | + ); |
| 37 | + const solanaUsdcVault = getAssociatedTokenAddressSync( |
| 38 | + new PublicKey(solanaUsdc), |
| 39 | + statePda, |
| 40 | + true, |
| 41 | + TOKEN_PROGRAM_ID, |
| 42 | + ASSOCIATED_TOKEN_PROGRAM_ID |
| 43 | + ).toBase58(); |
| 44 | + |
| 45 | + const { deployer } = await hre.getNamedAccounts(); |
| 46 | + const chainId = parseInt(await hre.getChainId()); |
| 47 | + |
| 48 | + const constructorArguments = [ |
| 49 | + USDC[chainId], |
| 50 | + L1_ADDRESS_MAP[chainId].cctpTokenMessenger, |
| 51 | + L1_ADDRESS_MAP[chainId].cctpMessageTransmitter, |
| 52 | + fromBase58ToBytes32(svmSpokePool), |
| 53 | + fromBase58ToBytes32(solanaUsdc), |
| 54 | + fromBase58ToBytes32(solanaUsdcVault), |
| 55 | + ]; |
| 56 | + |
| 57 | + const { address: deployment } = await hre.deployments.deploy("Solana_Adapter", { |
| 58 | + from: deployer, |
| 59 | + log: true, |
| 60 | + skipIfAlreadyDeployed: true, |
| 61 | + args: constructorArguments, |
| 62 | + }); |
| 63 | + |
| 64 | + await hre.run("verify:verify", { address: deployment, constructorArguments }); |
| 65 | +}; |
| 66 | + |
| 67 | +module.exports = func; |
| 68 | +func.tags = ["solanaAdapter", "mainnet"]; |
0 commit comments