rubic-sdk
Version:
Simplify dApp creation
70 lines • 3.32 kB
JavaScript
;
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