UNPKG

@fanitrade/fani-solana-tokenlist

Version:
342 lines 22 kB
import { PublicKey } from '@solana/web3.js'; import { BinaryReader, BinaryWriter, deserializeUnchecked } from 'borsh'; import base58 from 'bs58'; export const extendBorsh = () => { BinaryReader.prototype.readPubkey = function () { const reader = this; const array = reader.readFixedArray(32); return new PublicKey(array); }; BinaryWriter.prototype.writePubkey = function (value) { const writer = this; writer.writeFixedArray(value.toBuffer()); }; BinaryReader.prototype.readPubkeyAsString = function () { const reader = this; const array = reader.readFixedArray(32); return base58.encode(array); }; BinaryWriter.prototype.writePubkeyAsString = function (value) { const writer = this; writer.writeFixedArray(base58.decode(value)); }; }; extendBorsh(); const MetadataKey = { Uninitialized: 0, MetadataV1: 4, EditionV1: 1, MasterEditionV1: 2, MasterEditionV2: 6, EditionMarker: 7 }; export const METADATA_PREFIX = 'metadata'; export const EDITION = 'edition'; export const RESERVATION = 'reservation'; export const EDITION_MARKER_BIT_SIZE = 248; export const findProgramAddress = async (seeds, programId) => { const key = `pda-${seeds.reduce((agg, item) => agg + item.toString('hex'), '')}${programId.toString()}`; const cached = localStorage.getItem(key); if (cached) { const value = JSON.parse(cached); return [new PublicKey(value.key), parseInt(value.nonce)]; } const result = await PublicKey.findProgramAddress(seeds, programId); localStorage.setItem(key, JSON.stringify({ key: result[0].toBase58(), nonce: result[1] })); return result; }; export const decodeMetadata = (buffer) => { let metadata; try { metadata = deserializeUnchecked(METADATA_SCHEMA, Metadata, buffer); } catch { return; } return metadata; }; async function getEdition(tokenMint) { const PROGRAM_IDS = programIds(); return (await findProgramAddress([ Buffer.from(METADATA_PREFIX), PROGRAM_IDS.metadata.toBuffer(), tokenMint.toBuffer(), Buffer.from(EDITION) ], PROGRAM_IDS.metadata))[0]; } export class Metadata { constructor(args) { this.key = MetadataKey.MetadataV1; this.updateAuthority = args.updateAuthority; this.mint = args.mint; this.data = args.data; this.primarySaleHappened = args.primarySaleHappened; this.isMutable = args.isMutable; } async init() { const edition = await getEdition(this.mint); this.edition = edition; this.masterEdition = edition; } } export class MasterEditionV1 { constructor(args) { this.key = MetadataKey.MasterEditionV1; this.supply = args.supply; this.maxSupply = args.maxSupply; this.printingMint = args.printingMint; this.oneTimePrintingAuthorizationMint = args.oneTimePrintingAuthorizationMint; } } export class MasterEditionV2 { constructor(args) { this.key = MetadataKey.MasterEditionV2; this.supply = args.supply; this.maxSupply = args.maxSupply; } } class CreateMetadataArgs { constructor(args) { this.data = args.data; this.isMutable = args.isMutable; } } class UpdateMetadataArgs { constructor(args) { this.data = args.data ? args.data : null; this.updateAuthority = args.updateAuthority ? new PublicKey(args.updateAuthority) : null; this.primarySaleHappened = args.primarySaleHappened; } } class CreateMasterEditionArgs { constructor(args) { this.maxSupply = args.maxSupply; } } class MintPrintingTokensArgs { constructor(args) { this.supply = args.supply; } } export class EditionMarker { constructor(args) { this.key = MetadataKey.EditionMarker; this.ledger = args.ledger; } editionTaken(edition) { const editionOffset = edition % EDITION_MARKER_BIT_SIZE; const indexOffset = Math.floor(editionOffset / 8); if (indexOffset > 30) { throw new Error('bad index for edition'); } const positionInBitsetFromRight = 7 - (editionOffset % 8); const mask = Math.pow(2, positionInBitsetFromRight); const appliedMask = this.ledger[indexOffset] & mask; return appliedMask !== 0; } } export class Edition { constructor(args) { this.key = MetadataKey.EditionV1; this.parent = args.parent; this.edition = args.edition; } } export class Creator { constructor(args) { this.address = args.address; this.verified = args.verified; this.share = args.share; } } export class Data { constructor(args) { this.name = args.name; this.symbol = args.symbol; this.uri = args.uri; this.sellerFeeBasisPoints = args.sellerFeeBasisPoints; this.creators = args.creators; } } export const METADATA_SCHEMA = new Map([ [ CreateMetadataArgs, { kind: 'struct', fields: [ ['instruction', 'u8'], ['data', Data], ['isMutable', 'u8'] // bool ] } ], [ UpdateMetadataArgs, { kind: 'struct', fields: [ ['instruction', 'u8'], ['data', { kind: 'option', type: Data }], ['updateAuthority', { kind: 'option', type: 'pubkey' }], ['primarySaleHappened', { kind: 'option', type: 'u8' }] ] } ], [ CreateMasterEditionArgs, { kind: 'struct', fields: [ ['instruction', 'u8'], ['maxSupply', { kind: 'option', type: 'u64' }] ] } ], [ MintPrintingTokensArgs, { kind: 'struct', fields: [ ['instruction', 'u8'], ['supply', 'u64'] ] } ], [ MasterEditionV1, { kind: 'struct', fields: [ ['key', 'u8'], ['supply', 'u64'], ['maxSupply', { kind: 'option', type: 'u64' }], ['printingMint', 'pubkey'], ['oneTimePrintingAuthorizationMint', 'pubkey'] ] } ], [ MasterEditionV2, { kind: 'struct', fields: [ ['key', 'u8'], ['supply', 'u64'], ['maxSupply', { kind: 'option', type: 'u64' }] ] } ], [ Edition, { kind: 'struct', fields: [ ['key', 'u8'], ['parent', 'pubkey'], ['edition', 'u64'] ] } ], [ Data, { kind: 'struct', fields: [ ['name', 'string'], ['symbol', 'string'], ['uri', 'string'], ['sellerFeeBasisPoints', 'u16'], ['creators', { kind: 'option', type: [Creator] }] ] } ], [ Creator, { kind: 'struct', fields: [ ['address', 'pubkey'], ['verified', 'u8'], ['share', 'u8'] ] } ], [ Metadata, { kind: 'struct', fields: [ ['key', 'u8'], ['updateAuthority', 'pubkey'], ['mint', 'pubkey'], ['data', Data], ['primarySaleHappened', 'u8'], ['isMutable', 'u8'] // bool ] } ], [ EditionMarker, { kind: 'struct', fields: [ ['key', 'u8'], ['ledger', [31]] ] } ] ]); export const WRAPPED_SOL_MINT = new PublicKey('So11111111111111111111111111111111111111112'); export const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'); export const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = new PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'); export const BPF_UPGRADE_LOADER_ID = new PublicKey('BPFLoaderUpgradeab1e11111111111111111111111'); export const METADATA_PROGRAM_ID = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s' // 'GCUQ7oWCzgtRKnHnuJGxpr5XVeEkxYUXwTKYcqGtxLv4', ); export const MEMO_ID = new PublicKey('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'); export const VAULT_ID = new PublicKey('vau1zxA2LbssAUEF7Gpw91zMM1LvXrvpzJtmZ58rPsn' // '41cCnZ1Z1upJdtsS1tzFGR34cPFgJLzvJFmgYKpCqkz7', ); export const AUCTION_ID = new PublicKey('auctxRXPeJoc4817jDhf4HbjnhEcr1cCXenosMhK5R8' // '6u5XVthCStUfmNrYhFsST94oKxzwEZfZFHFhiCnB2nR1', ); export const METAPLEX_ID = new PublicKey('p1exdMJcjVao65QdewkaZRUnU6VPSXhus9n2GzWfh98' // '98jcGaKLKx9vv33H9edLUXAydrSipHhJGDQuPXBVPVGp', ); export const SYSTEM = new PublicKey('11111111111111111111111111111111'); export const ENABLE_FEES_INPUT = false; // legacy pools are used to show users contributions in those pools to allow for withdrawals of funds export const PROGRAM_IDS = [ { name: 'mainnet-beta' }, { name: 'testnet' }, { name: 'devnet' }, { name: 'localnet' } ]; export const programIds = () => { return { token: TOKEN_PROGRAM_ID, associatedToken: SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, bpf_upgrade_loader: BPF_UPGRADE_LOADER_ID, system: SYSTEM, metadata: METADATA_PROGRAM_ID, memo: MEMO_ID, vault: VAULT_ID, auction: AUCTION_ID, metaplex: METAPLEX_ID }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvTWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3pFLE9BQU8sTUFBTSxNQUFNLE1BQU0sQ0FBQztBQUUxQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFO0lBQzdCLFlBQVksQ0FBQyxTQUFpQixDQUFDLFVBQVUsR0FBRztRQUMzQyxNQUFNLE1BQU0sR0FBSSxJQUFnQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBaUIsQ0FBQyxXQUFXLEdBQUcsVUFBVSxLQUFnQjtRQUN0RSxNQUFNLE1BQU0sR0FBSSxJQUFnQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQWlCLENBQUMsa0JBQWtCLEdBQUc7UUFDbkQsTUFBTSxNQUFNLEdBQUksSUFBZ0MsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBaUIsQ0FBQyxtQkFBbUIsR0FBRyxVQUNwRCxLQUFVO1FBRVYsTUFBTSxNQUFNLEdBQUksSUFBZ0MsQ0FBQztRQUNq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