@chorus-one/solana
Version:
All-in-one toolkit for building staking dApps on Solana network
70 lines (69 loc) • 3.27 kB
JavaScript
;
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());