UNPKG

@debridge-finance/solana-utils

Version:

Common utils package to power communication with Solana contracts at deBridge

175 lines 10.3 kB
import { Buffer } from "buffer"; import { PublicKey } from "@solana/web3.js"; import * as constants from "./constants"; import { normalizeChainId } from "./crypto"; import { isBuffer } from "./interfaces"; import memoize from "micro-memoize"; export const TOKEN_2022_PROGRAM_ID = new PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); export const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); export const TOKEN_PROGRAM_ID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); export const WRAPPED_SOL_MINT = new PublicKey("So11111111111111111111111111111111111111112"); export function findAssociatedTokenAddress(wallet, tokenMint, tokenProgramId = TOKEN_PROGRAM_ID, associatedTokenProramId = ASSOCIATED_TOKEN_PROGRAM_ID) { return PublicKey.findProgramAddressSync([wallet.toBytes(), tokenProgramId.toBytes(), tokenMint.toBytes()], associatedTokenProramId); } /** * @deprecated same as findAssociatedTokenAddress */ export function findAssociatedTokenAddressSync(wallet, tokenMint, tokenProgramId = TOKEN_PROGRAM_ID, associatedTokenProramId = ASSOCIATED_TOKEN_PROGRAM_ID) { return PublicKey.findProgramAddressSync([wallet.toBytes(), tokenProgramId.toBytes(), tokenMint.toBytes()], associatedTokenProramId); } export function getTokenMetadataAddress(tokenMint, tokenMetadataProgramId) { return PublicKey.findProgramAddressSync([ Buffer.from("metadata"), tokenMetadataProgramId.toBytes(), tokenMint.toBytes(), ], tokenMetadataProgramId); } const deBridge = { getClaimMarkerAddress: (DEBRIDGE_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridge.Seeds.CLAIM_MARKER)], DEBRIDGE_PROGRAM_ID), getExternalCallStorageAddress: (submissionId, executorPubkey, sourceChainId, DEBRIDGE_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridge.Seeds.EXTERNAL_CALL_STORAGE), submissionId, new PublicKey(executorPubkey).toBytes(), normalizeChainId(sourceChainId), ], DEBRIDGE_PROGRAM_ID), getExternalCallMetaAddress: (externalCallStorage, DEBRIDGE_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridge.Seeds.EXTERNAL_CALL_META), new PublicKey(externalCallStorage).toBytes(), ], DEBRIDGE_PROGRAM_ID), getNonceAddress: (DEBRIDGE_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridge.Seeds.NONCE)], DEBRIDGE_PROGRAM_ID), getSubmissionAddress: (submissionId, DEBRIDGE_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridge.Seeds.SUBMISSION), submissionId], DEBRIDGE_PROGRAM_ID), getSubmissionAuthAddress: (submissionAddress, DEBRIDGE_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridge.Seeds.SUBMISSION_AUTH), new PublicKey(submissionAddress).toBytes(), ], DEBRIDGE_PROGRAM_ID), getMintAuthorityAddress: (bridge, DEBRIDGE_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridge.Seeds.BRIDGE_MINTER), new PublicKey(bridge).toBytes(), ], DEBRIDGE_PROGRAM_ID), }; const deBridgeSettings = { getTokenMetadataMasterAddress: (SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridgeSettings.Seeds.TOKEN_METADATA)], SETTINGS_PROGRAM_ID), getTokenMintAddress: (debridgeId, SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridgeSettings.Seeds.WRAPPER_TOKEN), debridgeId], SETTINGS_PROGRAM_ID), getStateAddress: (SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridgeSettings.Seeds.STATE)], SETTINGS_PROGRAM_ID), getConfirmationsStorageAddress: (message, SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridgeSettings.Seeds.CONFIRMATION_STORAGE), message, ], SETTINGS_PROGRAM_ID), getBridgeFeeAddress: (bridge, chainId, SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridgeSettings.Seeds.BRIDGE_FEE_INFO), bridge.toBytes(), normalizeChainId(chainId), ], SETTINGS_PROGRAM_ID), getChainSupportInfoAddress: (chainId, SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridgeSettings.Seeds.CHAIN_SUPPORT_INFO), normalizeChainId(chainId), ], SETTINGS_PROGRAM_ID), getDiscountInfoAddress: (user, SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridgeSettings.Seeds.DISCOUNT_INFO), user.toBytes(), ], SETTINGS_PROGRAM_ID), getBridgeAddress: (tokenMint, SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.deBridgeSettings.Seeds.BRIDGE), tokenMint.toBytes(), ], SETTINGS_PROGRAM_ID), getBridgeMapAddress: (bridgeId, SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridgeSettings.Seeds.SEND_BRIDGE_MAP), bridgeId], SETTINGS_PROGRAM_ID), getNoDiscountAddress: (SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridgeSettings.Seeds.NO_DISCOUNT)], SETTINGS_PROGRAM_ID), getNoBridgeFeeAddress: (SETTINGS_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.deBridgeSettings.Seeds.NO_BRIDGE_FEE_INFO)], SETTINGS_PROGRAM_ID), }; const DlnSrc = { getStateAccount: (DLN_SRC_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnSrc.Seeds.STATE)], DLN_SRC_PROGRAM_ID), getNonceAccount: (maker, DLN_SRC_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.dlnSrc.Seeds.NONCE), isBuffer(maker) ? maker : maker.toBuffer(), ], DLN_SRC_PROGRAM_ID), getGiveOrderStateAccount: (orderId, DLN_SRC_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnSrc.Seeds.ORDER_STATE), orderId], DLN_SRC_PROGRAM_ID), getAuthorizedNativeSenderAddress: (chainId, DLN_SRC_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnSrc.Seeds.AUTHORIZED_NATIVE_SENDER), chainId], DLN_SRC_PROGRAM_ID), getGiveOrderWalletAddress: (orderId, DLN_SRC_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnSrc.Seeds.GIVE_ORDER_WALLET), orderId], DLN_SRC_PROGRAM_ID), getFeeLedgerWalletAddress: (tokenMint, DLN_SRC_PROGRAM_ID) => PublicKey.findProgramAddressSync([ Buffer.from(constants.dlnSrc.Seeds.FEE_LEDGER_WALLET), tokenMint.toBuffer(), ], DLN_SRC_PROGRAM_ID), getFeeLedgerAddress: (DLN_SRC_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnSrc.Seeds.FEE_LEDGER)], DLN_SRC_PROGRAM_ID), }; const DlnDst = { getStateAddress: (DLN_DST_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnDst.Seeds.STATE)], DLN_DST_PROGRAM_ID), getAuthorizedSrcContractAddress: (chainId, DLN_DST_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnDst.Seeds.AUTHORIZED_SRC_CONTRACT), chainId], DLN_DST_PROGRAM_ID), getAuthorizedDstNativeSenderAddress: (DLN_DST_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnDst.Seeds.AUTHORIZED_DST_NATIVE_SENDER)], DLN_DST_PROGRAM_ID), getTakeOrderStateAddress: (orderId, DLN_DST_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnDst.Seeds.ORDER_STATE), orderId], DLN_DST_PROGRAM_ID), getTakePatchAddress: (orderId, DLN_DST_PROGRAM_ID) => PublicKey.findProgramAddressSync([Buffer.from(constants.dlnDst.Seeds.TAKE_PATCH), orderId], DLN_DST_PROGRAM_ID), }; function wrapFn(fn, arg) { return (...args) => fn(...args, arg); } class Resolver { constructor(programId, obj, memoizeList) { this.programId = new PublicKey(programId); const transformKey = (args) => { if (args.length <= 1) { return []; } else { return args.slice(0, -1).map((a) => JSON.stringify(a)); } }; let methods = {}; for (let [fnName, fn] of Object.entries(obj)) { if (fnName in memoizeList) { methods[fnName] = memoize(wrapFn(fn, this.programId), Object.assign({}, memoizeList[fnName])); } else { methods[fnName] = wrapFn(fn, this.programId); } } this.methods = methods; } } class ResolverContainer2 { constructor(resolver1, resolver2) { let methods = {}; for (let resolver of [resolver1, resolver2]) { for (let [fnName, fn] of Object.entries(resolver.methods)) { methods[fnName] = fn; } } this.methods = methods; } } export const DeBridgeResolver = (programId, settingsProgramId) => { const deBridgeMemoizeList = { getClaimMarkerAddress: {}, getNonceAddress: {}, getMintAuthorityAddress: { maxSize: 20 }, }; const settingsMemoizeList = { getTokenMetadataMasterAddress: {}, getTokenMintAddress: { maxSize: 5 }, getStateAddress: {}, getBridgeFeeAddress: { maxSize: 40 }, getChainSupportInfoAddress: { maxSize: 10 }, getBridgeAddress: { maxSize: 10 }, getBridgeMapAddress: { maxSize: 10 }, getNoBridgeFeeAddress: {}, getNoDiscountAddress: {}, }; return new ResolverContainer2(new Resolver(programId, deBridge, deBridgeMemoizeList), new Resolver(settingsProgramId, deBridgeSettings, settingsMemoizeList)); }; export const dlnSrcResolver = (programId) => { const dlnMemoizeList = { getStateAccount: {}, getAuthorizedNativeSenderAddress: { maxSize: 10 }, getFeeLedgerAddress: {}, getFeeLedgerWalletAddress: { maxSize: 10 }, }; return new Resolver(programId, DlnSrc, dlnMemoizeList); }; export const dlnDstResolver = (programId) => { const dstMemoizeList = { getAuthorizedSrcContractAddress: { maxSize: 10 }, getAuthorizedDstNativeSenderAddress: {}, getStateAddress: {}, }; return new Resolver(programId, DlnDst, dstMemoizeList); }; //# sourceMappingURL=accounts.js.map