UNPKG

@locker-labs/sdk

Version:

A utility library for enhancing your ERC-4337 experience

105 lines 5.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDepositForBurnPdas = exports.getPrograms = void 0; exports.getMessages = getMessages; exports.evmAddressToBytes32 = evmAddressToBytes32; exports.findProgramAddress = findProgramAddress; exports.findOrCreateUserTokenAccount = findOrCreateUserTokenAccount; exports.getMessageTransmitterFromChain = getMessageTransmitterFromChain; const anchor = require("@coral-xyz/anchor"); const web3_js_1 = require("@solana/web3.js"); const node_fetch_1 = require("node-fetch"); const spl_token_1 = require("@solana/spl-token"); const MessageTransmitterIDL = require("./target/idl/message_transmitter.json"); const TokenMessengerMinterIDL = require("./target/idl/token_messenger_minter.json"); const evmMessageTransmitterAbi = require("./abi/evm/message_transmitter.json"); const tokens_js_1 = require("../../../accounts/tokens.js"); const cctpConstants_js_1 = require("./cctpConstants.js"); const getPrograms = (provider) => { const messageTransmitterProgram = new anchor.Program(MessageTransmitterIDL, new web3_js_1.PublicKey("CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd"), provider); const tokenMessengerMinterProgram = new anchor.Program(TokenMessengerMinterIDL, new web3_js_1.PublicKey("CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3"), provider); return { messageTransmitterProgram, tokenMessengerMinterProgram }; }; exports.getPrograms = getPrograms; const getDepositForBurnPdas = ({ messageTransmitterProgram, tokenMessengerMinterProgram }, usdcAddress, destinationDomain) => { const messageTransmitterAccount = findProgramAddress("message_transmitter", messageTransmitterProgram.programId); const tokenMessengerAccount = findProgramAddress("token_messenger", tokenMessengerMinterProgram.programId); const tokenMinterAccount = findProgramAddress("token_minter", tokenMessengerMinterProgram.programId); const localToken = findProgramAddress("local_token", tokenMessengerMinterProgram.programId, [usdcAddress]); const remoteTokenMessengerKey = findProgramAddress("remote_token_messenger", tokenMessengerMinterProgram.programId, [ destinationDomain.toString(), ]); const authorityPda = findProgramAddress("sender_authority", tokenMessengerMinterProgram.programId); return { messageTransmitterAccount, tokenMessengerAccount, tokenMinterAccount, localToken, remoteTokenMessengerKey, authorityPda, }; }; exports.getDepositForBurnPdas = getDepositForBurnPdas; async function getMessages(txHash, irisApiUrl, solanaChain) { let attestationResponse = {}; const solanaDomain = cctpConstants_js_1.CCTP_DOMAIN_IDS[solanaChain]; while (attestationResponse.error || !attestationResponse.messages || attestationResponse.messages?.[0]?.attestation === 'PENDING') { const response = await (0, node_fetch_1.default)(`${irisApiUrl}/messages/${solanaDomain}/${txHash}`); attestationResponse = await response.json(); if (attestationResponse.error || !attestationResponse.messages || attestationResponse.messages?.[0]?.attestation === 'PENDING') { await new Promise((resolve) => setTimeout(resolve, 2000)); } } return attestationResponse; } function evmAddressToBytes32(address) { return `0x000000000000000000000000${address.replace('0x', '')}`; } function findProgramAddress(label, programId, extraSeeds = []) { const seeds = [Buffer.from(anchor.utils.bytes.utf8.encode(label))]; for (const extraSeed of extraSeeds) { if (typeof extraSeed === 'string') { seeds.push(Buffer.from(anchor.utils.bytes.utf8.encode(extraSeed))); } else if (Array.isArray(extraSeed)) { seeds.push(Buffer.from(new Uint8Array(extraSeed))); } else if (Buffer.isBuffer(extraSeed)) { seeds.push(Buffer.from(extraSeed)); } else { seeds.push(Buffer.from(extraSeed.toBuffer())); } } const [publicKey, bump] = web3_js_1.PublicKey.findProgramAddressSync(seeds, programId); return { publicKey, bump }; } async function findOrCreateUserTokenAccount(params) { const { solanaSigner, solanaTokenAddress, solanaRpcUrl } = params; const solanaTokenPublicKey = new web3_js_1.PublicKey(solanaTokenAddress); const connection = new web3_js_1.Connection(solanaRpcUrl); try { const tokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(solanaTokenPublicKey, solanaSigner.publicKey); await (0, spl_token_1.getAccount)(connection, tokenAccount); return tokenAccount; } catch (error) { throw new Error("Token account not found"); } } function getMessageTransmitterFromChain(chain) { if (chain === tokens_js_1.EChain.SOLANA || chain === tokens_js_1.EChain.SOLANA_DEVNET) { throw new Error(`Unsupported chain: ${chain}`); } const address = cctpConstants_js_1.CCTP_EVM_CONTRACTS.V1.MESSAGE_TRANSMITTER[chain]; console.log('Message transmitter address:', address); return { abi: evmMessageTransmitterAbi, address, }; } //# sourceMappingURL=cctpUtils.js.map