UNPKG

rubic-sdk

Version:
70 lines 3.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SolanaWeb3Private = void 0; const web3_js_1 = require("@solana/web3.js"); const utils_1 = require("ethers/lib/utils"); const blockchain_name_1 = require("../../../models/blockchain-name"); const evm_web3_private_1 = require("../evm-web3-private/evm-web3-private"); const web3_private_1 = require("../web3-private"); const solana_web3_pure_1 = require("../../../web3-pure/typed-web3-pure/solana-web3-pure/solana-web3-pure"); const injector_1 = require("../../../../injector/injector"); class SolanaWeb3Private extends web3_private_1.Web3Private { async getBlockchainName() { return blockchain_name_1.BLOCKCHAIN_NAME.SOLANA; } async sendTransaction(options, calculateConsumedParams = true) { try { const web3Public = injector_1.Injector.web3PublicService.getWeb3Public(blockchain_name_1.BLOCKCHAIN_NAME.SOLANA); const decodedData = options.data.startsWith('0x') ? Buffer.from(options.data.slice(2), 'hex') : utils_1.base64.decode(options.data); const { blockhash } = await web3Public.getRecentBlockhash(); const tx = web3_js_1.VersionedTransaction.deserialize(decodedData); tx.message.recentBlockhash = blockhash; if (calculateConsumedParams) { const [computedUnitsPrice, computedUnitsLimit] = await Promise.all([ web3Public.getConsumedUnitsPrice(tx), web3Public.getConsumedUnitsLimit(tx) ]); this.updatePriorityFee(tx, computedUnitsPrice, computedUnitsLimit); } const { signature } = await this.solanaWeb3.signAndSendTransaction(tx); options.onTransactionHash?.(signature); return signature; } catch (err) { console.error(`Send transaction error. ${err}`); throw evm_web3_private_1.EvmWeb3Private.parseError(err); } } updatePriorityFee(tx, computeUnitPrice, computeUnitLimit) { const computeBudgetOfset = 1; const computeUnitPriceData = tx.message.compiledInstructions[1].data; const encodedPrice = this.encodeNumberToArrayLE(computeUnitPrice, 8); for (let i = 0; i < encodedPrice.length; i++) { computeUnitPriceData[i + computeBudgetOfset] = encodedPrice[i]; } if (computeUnitLimit) { const computeUnitLimitData = tx.message.compiledInstructions[0].data; const encodedLimit = this.encodeNumberToArrayLE(computeUnitLimit, 4); for (let i = 0; i < encodedLimit.length; i++) { computeUnitLimitData[i + computeBudgetOfset] = encodedLimit[i]; } } } encodeNumberToArrayLE(num, arraySize) { const result = new Uint8Array(arraySize); for (let i = 0; i < arraySize; i++) { result[i] = Number(num & 0xff); num >>= 8; } return result; } constructor(solanaWeb3) { super(solanaWeb3.publicKey?.toString() || ''); this.solanaWeb3 = solanaWeb3; this.Web3Pure = solana_web3_pure_1.SolanaWeb3Pure; } } exports.SolanaWeb3Private = SolanaWeb3Private; //# sourceMappingURL=solana-web3-private.js.map