@saberhq/token-utils
Version:
Token-related math and transaction utilities for Solana.
131 lines • 4.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.deserializeMint = exports.deserializeAccount = exports.MintLayout = exports.TokenAccountLayout = exports.Uint64Layout = exports.PublicKeyLayout = exports.structLayout = exports.TypedStructure = exports.TypedLayout = void 0;
const tslib_1 = require("tslib");
const solana_contrib_1 = require("@saberhq/solana-contrib");
const BufferLayout = tslib_1.__importStar(require("@solana/buffer-layout"));
const spl_token_1 = require("@solana/spl-token");
var buffer_layout_1 = require("@solana/buffer-layout");
Object.defineProperty(exports, "TypedLayout", { enumerable: true, get: function () { return buffer_layout_1.Layout; } });
Object.defineProperty(exports, "TypedStructure", { enumerable: true, get: function () { return buffer_layout_1.Structure; } });
/**
* Typed struct buffer layout
* @param fields
* @param property
* @param decodePrefixes
* @returns
*/
const structLayout = (fields, property, decodePrefixes) => BufferLayout.struct(fields, property, decodePrefixes);
exports.structLayout = structLayout;
/**
* Layout for a public key
*/
const PublicKeyLayout = (property = "publicKey") => {
return BufferLayout.blob(32, property);
};
exports.PublicKeyLayout = PublicKeyLayout;
/**
* Layout for a 64bit unsigned value
*/
const Uint64Layout = (property = "uint64") => {
return BufferLayout.blob(8, property);
};
exports.Uint64Layout = Uint64Layout;
/**
* Layout for a TokenAccount.
*/
exports.TokenAccountLayout = spl_token_1.AccountLayout;
/**
* Layout for a Mint.
*/
exports.MintLayout = spl_token_1.MintLayout;
/**
* Deserializes a token account.
* @param address
* @param data
* @returns
*/
const deserializeAccount = (data) => {
const accountInfo = exports.TokenAccountLayout.decode(data);
const mint = new solana_contrib_1.PublicKey(accountInfo.mint);
const owner = new solana_contrib_1.PublicKey(accountInfo.owner);
const amount = spl_token_1.u64.fromBuffer(accountInfo.amount);
let delegate;
let delegatedAmount;
if (accountInfo.delegateOption === 0) {
delegate = null;
delegatedAmount = new spl_token_1.u64(0);
}
else {
delegate = new solana_contrib_1.PublicKey(accountInfo.delegate);
delegatedAmount = spl_token_1.u64.fromBuffer(accountInfo.delegatedAmount);
}
const isInitialized = accountInfo.state !== 0;
const isFrozen = accountInfo.state === 2;
let rentExemptReserve;
let isNative;
if (accountInfo.isNativeOption === 1) {
rentExemptReserve = spl_token_1.u64.fromBuffer(accountInfo.isNative);
isNative = true;
}
else {
rentExemptReserve = null;
isNative = false;
}
let closeAuthority;
if (accountInfo.closeAuthorityOption === 0) {
closeAuthority = null;
}
else {
closeAuthority = new solana_contrib_1.PublicKey(accountInfo.closeAuthority);
}
return {
mint,
owner,
amount,
delegate,
delegatedAmount,
isInitialized,
isFrozen,
rentExemptReserve,
isNative,
closeAuthority,
};
};
exports.deserializeAccount = deserializeAccount;
/**
* Deserialize a {@link Buffer} into a {@link MintInfo}.
* @param data
* @returns
*/
const deserializeMint = (data) => {
if (data.length !== exports.MintLayout.span) {
throw new Error("Not a valid Mint");
}
const mintInfo = exports.MintLayout.decode(data);
let mintAuthority;
if (mintInfo.mintAuthorityOption === 0) {
mintAuthority = null;
}
else {
mintAuthority = new solana_contrib_1.PublicKey(mintInfo.mintAuthority);
}
const supply = spl_token_1.u64.fromBuffer(mintInfo.supply);
const isInitialized = mintInfo.isInitialized !== 0;
let freezeAuthority;
if (mintInfo.freezeAuthorityOption === 0) {
freezeAuthority = null;
}
else {
freezeAuthority = new solana_contrib_1.PublicKey(mintInfo.freezeAuthority);
}
return {
mintAuthority,
supply,
decimals: mintInfo.decimals,
isInitialized,
freezeAuthority,
};
};
exports.deserializeMint = deserializeMint;
//# sourceMappingURL=layout.js.map