UNPKG

@chorus-one/solana

Version:

All-in-one toolkit for building staking dApps on Solana network

70 lines (69 loc) 3.27 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTrackingInstruction = exports.trackingStringToPubkey = exports.getDenomMultiplier = exports.denomToMacroAmount = exports.macroToDenomAmount = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const utils_1 = require("@chorus-one/utils"); const web3_js_1 = require("@solana/web3.js"); const crypto_1 = require("crypto"); function macroToDenomAmount(amount, // in macro denom (e.g. ATOM) denomMultiplier) { (0, utils_1.checkMaxDecimalPlaces)(denomMultiplier); if (BigInt(denomMultiplier) === BigInt(0)) { throw new Error('denomMultiplier cannot be 0'); } if ((0, bignumber_js_1.default)(amount).isNaN()) { throw new Error('invalid amount: ' + amount + ' failed to parse to number'); } const macroAmount = (0, bignumber_js_1.default)(denomMultiplier).multipliedBy(amount); if (macroAmount.isNegative()) { throw new Error('amount cannot be negative'); } const decimalPlaces = macroAmount.decimalPlaces(); if (decimalPlaces !== null && decimalPlaces > 0) { throw new Error(`exceeded maximum denominator precision, amount: ${macroAmount.toString()}, precision: .${macroAmount.precision()}`); } // solana web3.js uses number for amount return macroAmount.toNumber(); } exports.macroToDenomAmount = macroToDenomAmount; function denomToMacroAmount(amount, // in denom (e.g. uatom, adydx) denomMultiplier) { (0, utils_1.checkMaxDecimalPlaces)(denomMultiplier); if (BigInt(denomMultiplier) === BigInt(0)) { throw new Error('denomMultiplier cannot be 0'); } if ((0, bignumber_js_1.default)(amount).isNaN()) { throw new Error('invalid amount: ' + amount + ' failed to parse to number'); } // solana web3.js uses number for amount return (0, bignumber_js_1.default)(amount).dividedBy(denomMultiplier).toNumber(); } exports.denomToMacroAmount = denomToMacroAmount; function getDenomMultiplier(denomMultiplier) { if (denomMultiplier) { return denomMultiplier; } return (0, bignumber_js_1.default)(web3_js_1.LAMPORTS_PER_SOL).toString(10); } exports.getDenomMultiplier = getDenomMultiplier; function trackingStringToPubkey(inputString) { const inputBytes = new Uint8Array(new TextEncoder().encode(inputString)); const hashed = (0, crypto_1.createHash)('sha256').update(inputBytes).digest(); return new web3_js_1.PublicKey(hashed); } exports.trackingStringToPubkey = trackingStringToPubkey; const NOOP_PROGRAM_ID = new web3_js_1.PublicKey('noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV'); const getTrackingInstruction = (referrer) => { const trackingPublicKey = trackingStringToPubkey(referrer); return new web3_js_1.TransactionInstruction({ keys: [{ pubkey: trackingPublicKey, isSigner: false, isWritable: false }], programId: NOOP_PROGRAM_ID, data: Buffer.alloc(0) }); }; exports.getTrackingInstruction = getTrackingInstruction; const safepal = trackingStringToPubkey('d716b5a3-chorusone-staking'); console.log('safepal', safepal.toBase58());