UNPKG

@okwallet/extension

Version:

OKX Wallet provides official SDK packages of multiple chains including [Ethereum](./wallet), [Aptos](./aptos-api), [Tron](./tron-api) and Solana. Developers can interact with different on-chain projects through OKX Wallet SDK.

102 lines (92 loc) 2.88 kB
import { Connection, Transaction, clusterApiUrl, Keypair, } from '@solana/web3.js'; import { mnemonicToSeedSync } from 'bip39'; const Solana = { network: null, getSolanaConnection: () => { const connection = new Connection(Solana.network ? Solana.network : clusterApiUrl('mainnet-beta')); return connection; }, signSolanaTransaction: async (payload, connection, feePayer) => { const { transaction, bizType, bizId = [], notReplaceBlockhash = false, } = payload; let finalTransaction = null; const getInstruction = () => { if (typeof payload?.toJSON === 'function') { return payload; } return payload?.instruction; }; const blockhashObj = await connection.getLatestBlockhash(); const recentBlockhash = blockhashObj?.blockhash; const lastValidBlockHeight = blockhashObj?.lastValidBlockHeight; const instruction = getInstruction(); if (instruction) { finalTransaction = new Transaction({ feePayer, blockhash: recentBlockhash, lastValidBlockHeight, }).add(instruction); } else if (transaction) { if (!notReplaceBlockhash) { transaction.signatures = []; transaction.recentBlockhash = recentBlockhash; transaction.lastValidBlockHeight = lastValidBlockHeight; bizId.forEach((password) => { const seed = mnemonicToSeedSync(bizType, password); const keypair = Keypair.fromSeed(seed.slice(0, 32)); transaction.partialSign(keypair); }); } finalTransaction = transaction; } return finalTransaction; }, sendTransaction: ({ provider, payload }) => { return new Promise(async (resolve, reject) => { const connection = Solana.getSolanaConnection(); const transaction = await Solana.signSolanaTransaction( payload, connection, provider.solana.publicKey ); if (!transaction) { throw new Error('no transaction'); } try { const res = await provider.solana.signAndSendTransaction(transaction); resolve({ ...res, hash: res.signature }); } catch (e) { reject(e); } }); }, signMessage: ({ provider, payload }) => { return new Promise((resolve, reject) => { const encodedMessage = new TextEncoder().encode(payload.message); provider.solana.publicKey && provider.solana .signMessage(encodedMessage, 'utf8') .then((signedMessage) => { const signature = Array.prototype.map .call(signedMessage.signature, (x) => { return `00${x.toString(16)}`.slice(-2); }) .join(''); resolve(signature); }) .catch((e) => { reject(e); }); }); }, }; export default Solana;