@locker-labs/sdk
Version:
A utility library for enhancing your ERC-4337 experience
105 lines • 5.22 kB
JavaScript
;
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