pangu-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/accounts-BuD-oCcr.d.mts +206 -0
- package/dist/accounts-BuD-oCcr.d.ts +206 -0
- package/dist/dbc.d.mts +505 -0
- package/dist/dbc.d.ts +505 -0
- package/dist/dbc.js +3003 -0
- package/dist/dbc.js.map +1 -0
- package/dist/dbc.mjs +3027 -0
- package/dist/dbc.mjs.map +1 -0
- package/dist/feed-CY-pcUU2.d.mts +269 -0
- package/dist/feed-Zwu1irEx.d.ts +269 -0
- package/dist/index.d.mts +415 -0
- package/dist/index.d.ts +415 -0
- package/dist/index.js +2809 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2803 -0
- package/dist/index.mjs.map +1 -0
- package/dist/price.d.mts +86 -0
- package/dist/price.d.ts +86 -0
- package/dist/price.js +1554 -0
- package/dist/price.js.map +1 -0
- package/dist/price.mjs +1533 -0
- package/dist/price.mjs.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/price.ts","../src/addresses.ts","../src/constants.ts","../src/idl/pangu.json","../src/inputs.ts"],"sourcesContent":["/**\n * Keeping a banded sale's price fresh.\n *\n * Node and server only. It reaches Pyth's Hermes service over the network with\n * an API key, and it pulls in `@pythnetwork/pyth-solana-receiver`, so the web\n * app calls it from a server route and never from the browser. The key would be\n * in every browser bundle otherwise, and every Hermes read has needed one since\n * 26 August 2026\n * (https://docs.pyth.network/price-feeds/core/upgrade/preparing). Reading a price back is\n * `readPrice` in the core entry point, which is browser safe.\n */\n\nimport type { Connection, PublicKey, Signer, VersionedTransaction } from \"@solana/web3.js\";\nimport { PythSolanaReceiver } from \"@pythnetwork/pyth-solana-receiver\";\nimport type { Sale } from \"./accounts.js\";\nimport { feedIdHex, priceFeedAddress, type FeedId } from \"./addresses.js\";\nimport { LIMITS, PANGU_SHARD_ID } from \"./constants.js\";\nimport {\n PanguInputError,\n requireRealPublicKey,\n requireWholeNumber,\n} from \"./inputs.js\";\n\nconst HERMES_URL = \"https://hermes.pyth.network\";\n\n/** The environment variable the Hermes key is read from. Server side only. */\nexport const API_KEY_VARIABLE = \"PYTH_API_KEY\";\n\n/**\n * A flat priority fee, never one taken from a trial simulation. A failed\n * simulation once poisoned a limit and every later run died for compute instead\n * of for the real reason.\n */\nconst COMPUTE_UNIT_PRICE_MICRO_LAMPORTS = 20_000;\n\n/** How long to wait on Hermes before giving up, in milliseconds. */\nconst HERMES_TIMEOUT_MS = 15_000;\n\n/** The feed a refresh writes: taken off a sale, or given by hand. */\nexport interface FeedChoice {\n priceFeedId: FeedId;\n /** Defaults to Pangu's own shard, the one its refresher writes. */\n shard?: number;\n}\n\nexport interface RefreshPriceInput {\n connection: Connection;\n /** Who pays the fee. Anyone can: the payer is not part of the address. */\n payer: PublicKey;\n /** A sale read from the chain, or the feed by hand. */\n sale?: Sale;\n feed?: FeedChoice;\n /**\n * The Hermes API key. Defaults to `PYTH_API_KEY` in the environment, which is\n * where it should live: it is never a value a browser or a caller passes in.\n */\n apiKey?: string;\n /** Another Hermes host, for a self-hosted one. */\n hermesUrl?: string;\n}\n\n/** One transaction of a refresh, unsigned, with the keys it needs besides the payer. */\nexport interface RefreshTransaction {\n transaction: VersionedTransaction;\n /** Ephemeral accounts the guardian-signed update is verified through. */\n signers: Signer[];\n}\n\nexport interface RefreshPrice {\n /**\n * Unsigned, in order. The payer signs each one and sends them in this order:\n * the update is posted into an encoded VAA account first and the price feed\n * account is written from it second, and the pair does not fit in one\n * transaction.\n */\n transactions: RefreshTransaction[];\n /** The one account this feed and shard write to, for reading back afterwards. */\n priceAccount: PublicKey;\n shard: number;\n /** Lowercase hex, no prefix. */\n feedId: string;\n /** Every transaction's bytes added up, against a limit of 1232 each. */\n bytes: number;\n}\n\nfunction feedOf(input: RefreshPriceInput): { feedId: string; shard: number } {\n if (input.sale !== undefined && input.sale !== null) {\n if (!input.sale.hasBand) {\n throw new PanguInputError(\n \"this sale has no price band, so it has no price to refresh\"\n );\n }\n return { feedId: input.sale.priceFeedId, shard: input.sale.priceShard };\n }\n if (input.feed === undefined || input.feed === null) {\n throw new PanguInputError(\"a refresh needs either a sale or a feed id\");\n }\n return {\n feedId: feedIdHex(input.feed.priceFeedId),\n shard:\n input.feed.shard === undefined\n ? PANGU_SHARD_ID\n : requireWholeNumber(input.feed.shard, \"feed.shard\", 0, LIMITS.maxShard),\n };\n}\n\n/**\n * The Hermes key, from the caller or from the environment.\n *\n * Throws PanguInputError naming the variable when there is none. The key itself\n * is never part of a message, a log line or a returned value.\n */\nfunction apiKey(given: string | undefined): string {\n const key =\n given === undefined || given === \"\"\n ? (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env?.[API_KEY_VARIABLE]\n : given;\n if (key === undefined || key === \"\") {\n throw new PanguInputError(\n `${API_KEY_VARIABLE} is not set. Every Hermes read has needed a key since 26 August 2026, and it belongs in the server's environment, never in a browser.`\n );\n }\n return key;\n}\n\n/** The latest guardian-signed update for one feed, base64, straight from Pyth. */\nasync function latestUpdate(\n host: string,\n feedId: string,\n key: string\n): Promise<string[]> {\n const url = `${host}/v2/updates/price/latest?ids[]=${feedId}&encoding=base64`;\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${key}` },\n signal: AbortSignal.timeout(HERMES_TIMEOUT_MS),\n });\n if (!response.ok) {\n // The body, never the key: a 401 here means the key has run out. Whatever\n // Hermes says is scrubbed of the key before it is put in a message, because\n // an error text ends up in a log.\n const body = (await response.text()).slice(0, 200).split(key).join(\"[key]\");\n throw new PanguInputError(`Hermes answered ${response.status}: ${body}`);\n }\n const body = (await response.json()) as { binary?: { data?: string[] } };\n const data = body?.binary?.data;\n if (!Array.isArray(data) || data.length === 0 || typeof data[0] !== \"string\") {\n throw new PanguInputError(\"Hermes returned no price update for this feed\");\n }\n return data;\n}\n\n/**\n * Builds the transactions that write a fresh stock price into the one account\n * this sale reads.\n *\n * Anybody can send them and the payer is not one of the account's seeds, so the\n * address never moves and a sale can name it before anyone has ever refreshed\n * it. It takes two transactions, not one: the guardian-signed update has to be\n * posted into an encoded VAA account before the price feed account can be\n * written from it, and the pair does not fit in 1232 bytes. So a refresh cannot\n * ride along with a buy; send it first and the buy straight after, inside the\n * age the sale allows.\n *\n * The encoded VAA account is closed by the last transaction, which is the\n * difference between a refresh costing about 35 thousand lamports and about\n * 2.4 million (docs/measurements/price-band-pyth.md). The price feed account\n * itself is a program address, it is not one of the accounts closed, and it\n * stays where it is.\n *\n * Node and server only. Signs and sends nothing.\n *\n * Throws PanguInputError when neither a sale nor a feed is given, when the sale\n * has no band, when there is no API key, or when Hermes refuses.\n */\nexport async function refreshPriceTransaction(\n input: RefreshPriceInput\n): Promise<RefreshPrice> {\n const payer = requireRealPublicKey(input.payer, \"payer\");\n const { feedId, shard } = feedOf(input);\n const key = apiKey(input.apiKey);\n\n const updateData = await latestUpdate(\n input.hermesUrl ?? HERMES_URL,\n feedId,\n key\n );\n\n // The receiver builds transactions through an Anchor provider, which wants a\n // wallet. Nothing here signs, so the wallet is the payer's key and two\n // refusals: a caller that wants these signed has the transactions back to\n // sign itself.\n const wallet = {\n publicKey: payer,\n signTransaction: () => {\n throw new PanguInputError(\"pangu-sdk never signs, sign the transactions yourself\");\n },\n signAllTransactions: () => {\n throw new PanguInputError(\"pangu-sdk never signs, sign the transactions yourself\");\n },\n } as unknown as ConstructorParameters<typeof PythSolanaReceiver>[0][\"wallet\"];\n\n const receiver = new PythSolanaReceiver({ connection: input.connection, wallet });\n const builder = receiver.newTransactionBuilder({ closeUpdateAccounts: true });\n await builder.addUpdatePriceFeed(updateData, shard);\n\n const built = await builder.buildVersionedTransactions({\n computeUnitPriceMicroLamports: COMPUTE_UNIT_PRICE_MICRO_LAMPORTS,\n });\n const transactions = built.map((entry) => ({\n transaction: entry.tx,\n signers: entry.signers,\n }));\n\n return {\n transactions,\n priceAccount: priceFeedAddress(feedId, shard),\n shard,\n feedId,\n bytes: transactions.reduce(\n (total, entry) => total + entry.transaction.serialize().length,\n 0\n ),\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport {\n DBC_PROGRAM_ID,\n LIMITS,\n PANGU_PROGRAM_ID,\n PANGU_SHARD_ID,\n PYTH_PRICE_FEED_PROGRAM_ID,\n SAS_PROGRAM_ID,\n SEEDS,\n} from \"./constants.js\";\nimport {\n PanguInputError,\n requirePublicKey,\n requireWholeNumber,\n} from \"./inputs.js\";\n\n/** A Pyth feed id, either 32 raw bytes or the same bytes written as hex. */\nexport type FeedId = string | Uint8Array | number[];\n\nconst HEX = /^[0-9a-fA-F]+$/;\n\nfunction seed(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n}\n\n/**\n * The one place a feed id is turned into bytes.\n *\n * Everything that derives an address or encodes an instruction goes through\n * this, so a hex string and a byte array can never be compared after two\n * different readings. A leading \"0x\" is accepted because that is how the feed\n * scripts print ids. Anything that is not exactly 32 bytes is refused.\n */\nexport function feedIdBytes(id: FeedId): Uint8Array {\n let bytes: Uint8Array;\n if (typeof id === \"string\") {\n const text = id.startsWith(\"0x\") || id.startsWith(\"0X\") ? id.slice(2) : id;\n if (text.length !== LIMITS.feedIdLength * 2 || !HEX.test(text)) {\n throw new PanguInputError(\n `a feed id must be ${LIMITS.feedIdLength * 2} hex characters, got \"${id}\"`\n );\n }\n bytes = new Uint8Array(LIMITS.feedIdLength);\n for (let i = 0; i < LIMITS.feedIdLength; i += 1) {\n bytes[i] = Number.parseInt(text.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n }\n if (Array.isArray(id)) {\n if (id.some((byte) => !Number.isInteger(byte) || byte < 0 || byte > 255)) {\n throw new PanguInputError(\"a feed id array must hold whole bytes\");\n }\n bytes = Uint8Array.from(id);\n } else if (id instanceof Uint8Array) {\n bytes = id;\n } else {\n throw new PanguInputError(\"a feed id must be hex or 32 bytes\");\n }\n if (bytes.length !== LIMITS.feedIdLength) {\n throw new PanguInputError(\n `a feed id must be ${LIMITS.feedIdLength} bytes, got ${bytes.length}`\n );\n }\n return bytes;\n}\n\n/** The same id as lowercase hex with no prefix, which is how the feed scripts print it. */\nexport function feedIdHex(id: FeedId): string {\n return Array.from(feedIdBytes(id))\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/** The rules account of one sale. Seeds \"sale\" and the mint. */\nexport function saleRulesAddress(mint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [seed(SEEDS.sale), requirePublicKey(mint, \"mint\").toBuffer()],\n PANGU_PROGRAM_ID\n )[0];\n}\n\n/** One wallet's record in one sale. Seeds \"buyer\", the mint and the wallet. */\nexport function buyerRecordAddress(mint: PublicKey, wallet: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n seed(SEEDS.buyer),\n requirePublicKey(mint, \"mint\").toBuffer(),\n requirePublicKey(wallet, \"wallet\").toBuffer(),\n ],\n PANGU_PROGRAM_ID\n )[0];\n}\n\n/** The transfer hook's published account list. Seeds fixed by the SPL interface. */\nexport function extraAccountListAddress(mint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [seed(SEEDS.extraAccountMetas), requirePublicKey(mint, \"mint\").toBuffer()],\n PANGU_PROGRAM_ID\n )[0];\n}\n\n/**\n * The one address an attestation for this credential, schema and wallet can have.\n * Derived under the attestation service, not under Pangu.\n */\nexport function attestationAddress(\n credential: PublicKey,\n schema: PublicKey,\n wallet: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n seed(SEEDS.attestation),\n requirePublicKey(credential, \"credential\").toBuffer(),\n requirePublicKey(schema, \"schema\").toBuffer(),\n requirePublicKey(wallet, \"wallet\").toBuffer(),\n ],\n SAS_PROGRAM_ID\n )[0];\n}\n\n/** The pool's base token vault. Derived under DBC, which is what owns it. */\nexport function dbcBaseVaultAddress(mint: PublicKey, pool: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n seed(SEEDS.dbcTokenVault),\n requirePublicKey(mint, \"mint\").toBuffer(),\n requirePublicKey(pool, \"pool\").toBuffer(),\n ],\n DBC_PROGRAM_ID\n )[0];\n}\n\n/**\n * The one price feed account a Pyth shard and feed id can produce.\n *\n * The seeds are the shard id as two little endian bytes and then the 32 byte\n * feed id, under Pyth's price feed program. The payer is not a seed, so the\n * address is fixed before anybody has refreshed it and nobody can create a\n * rival account for the same shard and feed. This is the same derivation\n * `price_feed_address` runs in programs/pangu/src/price.rs, and the same one\n * `getPriceFeedAccountForProgram` runs in `@pythnetwork/pyth-solana-receiver`.\n *\n * The shard defaults to Pangu's own, which is the shard Pangu's refresher\n * writes. Throws PanguInputError for a shard outside the two bytes it is\n * written into, or a feed id that is not 32 bytes.\n */\nexport function priceFeedAddress(\n feedId: FeedId,\n shard: number = PANGU_SHARD_ID\n): PublicKey {\n const id = feedIdBytes(feedId);\n const shardId = requireWholeNumber(shard, \"shard\", 0, LIMITS.maxShard);\n const seedBytes = new Uint8Array(2);\n seedBytes[0] = shardId & 0xff;\n seedBytes[1] = (shardId >> 8) & 0xff;\n return PublicKey.findProgramAddressSync(\n [seedBytes, id],\n PYTH_PRICE_FEED_PROGRAM_ID\n )[0];\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport type { Idl } from \"@anchor-lang/core\";\nimport idlJson from \"./idl/pangu.json\";\n\n/**\n * The generated interface of the Pangu program, copied from the program's build\n * by `npm run sync-idl`. Everything else in this package is derived from it, so\n * a rebuilt program cannot leave a stale discriminator or error code behind.\n */\nexport const PANGU_IDL = idlJson as Idl;\n\nexport const PANGU_PROGRAM_ID = new PublicKey(PANGU_IDL.address);\n\n/** Meteora's Dynamic Bonding Curve. Source: programs/pangu/src/dbc.rs. */\nexport const DBC_PROGRAM_ID = new PublicKey(\n \"dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN\"\n);\n\n/** The Solana Attestation Service. Source: programs/pangu/src/sas.rs. */\nexport const SAS_PROGRAM_ID = new PublicKey(\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\"\n);\n\n/**\n * Pyth's price feed program. Every price feed account is a program address of\n * this program over a shard id and a feed id, so a sale can name the address\n * before anybody has ever refreshed it.\n * Source: programs/pangu/src/price.rs, PRICE_FEED_PROGRAM_ID.\n */\nexport const PYTH_PRICE_FEED_PROGRAM_ID = new PublicKey(\n \"pythWSnswVUd12oZpeFP8e9CVaEqJg25g1Vtc2biRsT\"\n);\n\n/**\n * Pyth's receiver program, the only program that can write a price feed\n * account, and only after checking the Wormhole guardians' signatures.\n * Source: programs/pangu/src/price.rs, RECEIVER_PROGRAM_ID.\n */\nexport const PYTH_RECEIVER_PROGRAM_ID = new PublicKey(\n \"rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ\"\n);\n\n/**\n * The Pyth shard Pangu refreshes. A shard is a second copy of the same feed at\n * a second address, so a sale depends on a price Pangu's own refresher keeps\n * fresh rather than on the sponsored one.\n * Source: programs/pangu/src/price.rs, PANGU_SHARD_ID.\n */\nexport const PANGU_SHARD_ID = 7_700;\n\nexport { TOKEN_2022_PROGRAM_ID };\n\n/**\n * The SaleRules layouts this package reads. Source: state.rs,\n * SALE_RULES_OLDEST_READABLE_VERSION to SALE_RULES_LAYOUT_VERSION. Version 2\n * added the paying token and the end of the offering period in what used to be\n * spare bytes, so a version 1 account is the same size with every older field\n * in place. An account carrying any other number was written by a different\n * build of the program, so every field behind the version byte may sit\n * somewhere else.\n */\nexport const SALE_RULES_LAYOUT_VERSIONS: ReadonlySet<number> = new Set([1, 2]);\n\nexport const ACCESS_MODE = {\n open: 0,\n issuerList: 1,\n verifierCredential: 2,\n} as const;\n\nexport type AccessMode = (typeof ACCESS_MODE)[keyof typeof ACCESS_MODE];\n\n/**\n * The seed prefixes the program and its neighbours derive addresses from.\n * Source: state.rs (sale, buyer, extra-account-metas), sas.rs (attestation),\n * the attestation service source (credential, schema), dbc.rs (token_vault).\n */\nexport const SEEDS = {\n sale: \"sale\",\n buyer: \"buyer\",\n extraAccountMetas: \"extra-account-metas\",\n attestation: \"attestation\",\n credential: \"credential\",\n schema: \"schema\",\n dbcTokenVault: \"token_vault\",\n} as const;\n\n/**\n * The limits the program itself enforces. Each one names the Rust constant or\n * check it copies, so a change on chain has one place to land here.\n */\nexport const LIMITS = {\n /** price.rs MAX_BAND_BPS: half again over the live stock price. */\n maxBandBps: 5_000,\n minBandBps: 1,\n /** price.rs MAX_PRICE_AGE_SECS, and create_sale.rs check_band takes 1..=3600. */\n maxPriceAgeSecs: 3_600,\n minPriceAgeSecs: 1,\n /** price.rs MAX_CONF_BPS: ten percent, and check_band takes 1..=1000. */\n maxConfBps: 1_000,\n minConfBps: 1,\n /** price.rs MAX_DECIMALS. */\n maxDecimals: 18,\n /** Every Pyth feed id is 32 bytes. */\n feedIdLength: 32,\n /** A Pyth shard id is a u16, which is what the address seed holds. */\n maxShard: 65_535,\n /** u64 raw token units, the widest cap the program can hold. */\n maxCap: (1n << 64n) - 1n,\n} as const;\n\n/**\n * The paying tokens each build of the program accepts under a price ceiling.\n * Source: create_sale.rs, DOLLAR_MINTS, which differs between the mainnet build\n * and the devnet build (feature \"devnet\"). Circle's devnet USDC and the demo\n * dollar mean nothing on mainnet, which is why the lists are separate.\n */\nconst DOLLAR_MINT_ADDRESSES = {\n mainnet: [\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"],\n devnet: [\n \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n \"2TYsrKmXKrqxLRULNBGFrGjTnxebo1H2azRb7bzQPem5\",\n ],\n} as const;\n\n/**\n * The dollar tokens a banded sale can be paid in on `network`, in the order the\n * program lists them. A fresh array each call, so a caller cannot change the\n * list another caller reads.\n *\n * Covers the exact addresses the program checks. Does not say whether a listed\n * stablecoin still holds its peg. Throws for any network other than \"devnet\" or\n * \"mainnet\", because guessing a list would let a ceiling through the program\n * then refuses.\n */\nexport function dollarMints(network: \"devnet\" | \"mainnet\"): PublicKey[] {\n if (!Object.prototype.hasOwnProperty.call(DOLLAR_MINT_ADDRESSES, network)) {\n throw new Error(`no dollar list for network \"${String(network)}\": use \"devnet\" or \"mainnet\"`);\n }\n return DOLLAR_MINT_ADDRESSES[network].map((address) => new PublicKey(address));\n}\n","{\n \"address\": \"4Nd46mDiaTSkqXPAXKqT4jkahcz1TxVSdoirbBCAr5qG\",\n \"metadata\": {\n \"name\": \"pangu\",\n \"version\": \"0.1.0\",\n \"spec\": \"0.1.0\",\n \"description\": \"Rules for a fair first sale of a stock token on Meteora DBC\"\n },\n \"docs\": [\n \"Pangu holds the rules of a stock token's first sale on Meteora's Dynamic Bonding\",\n \"Curve: a cap per wallet, an optional issuer-approved buyer list, an optional\",\n \"ceiling against the real stock's live price, and no wallet-to-wallet movement\",\n \"until the sale is over. DBC finds the price, Pangu decides who may receive\",\n \"tokens and how many.\"\n ],\n \"instructions\": [\n {\n \"name\": \"approve_buyer\",\n \"discriminator\": [\n 193,\n 6,\n 144,\n 245,\n 24,\n 184,\n 227,\n 19\n ],\n \"accounts\": [\n {\n \"name\": \"issuer\",\n \"writable\": true,\n \"signer\": true,\n \"relations\": [\n \"rules\"\n ]\n },\n {\n \"name\": \"mint\",\n \"relations\": [\n \"rules\"\n ]\n },\n {\n \"name\": \"rules\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 97,\n 108,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"record\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 98,\n 117,\n 121,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n },\n {\n \"kind\": \"arg\",\n \"path\": \"wallet\"\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n }\n ]\n },\n {\n \"name\": \"close_buyer_record\",\n \"discriminator\": [\n 27,\n 105,\n 238,\n 144,\n 158,\n 212,\n 40,\n 114\n ],\n \"accounts\": [\n {\n \"name\": \"wallet\",\n \"writable\": true,\n \"signer\": true,\n \"relations\": [\n \"record\"\n ]\n },\n {\n \"name\": \"mint\",\n \"relations\": [\n \"record\"\n ]\n },\n {\n \"name\": \"record\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 98,\n 117,\n 121,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"wallet\"\n }\n ]\n }\n },\n {\n \"name\": \"rules\",\n \"docs\": [\n \"offering period is over, and only when the bytes are a SaleRules in a\",\n \"layout this build reads. Anything else, including rules written by an\",\n \"older build, reads as \\\"not over\\\" and leaves the two older ways in exactly\",\n \"as they were, so this account can never stop a close that worked before.\"\n ],\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 97,\n 108,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_sale\",\n \"discriminator\": [\n 137,\n 197,\n 124,\n 245,\n 254,\n 35,\n 17,\n 12\n ],\n \"accounts\": [\n {\n \"name\": \"issuer\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"owning program, the length and the discriminator before any field is used.\"\n ]\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"owning program is checked there before the bytes are read.\"\n ]\n },\n {\n \"name\": \"credential\",\n \"docs\": [\n \"key named in `credential`, owned by the attestation service, and to carry\",\n \"the credential discriminator. Refused outright in the other modes.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"schema\",\n \"docs\": [\n \"key named in `schema`, owned by the attestation service, to belong to\",\n \"`credential`, and not to be paused. Refused outright in the other modes.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"dbc_config\",\n \"docs\": [\n \"template this pool names, owned by DBC and of the right kind. Its fee mode\",\n \"and the supply its curve sells decide whether the sale may open at all, and\",\n \"it names the paying token.\"\n ]\n },\n {\n \"name\": \"quote_mint\",\n \"docs\": [\n \"Required in every mode. Must be the paying token the template names. It is\",\n \"stored in the rules, its freeze authority is checked, and on a banded sale\",\n \"its decimals are stored so the hook can turn a curve price into dollars\",\n \"without being handed a mint at buy time.\"\n ]\n },\n {\n \"name\": \"rules\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 97,\n 108,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"extra_account_meta_list\",\n \"docs\": [\n \"seeds the transfer-hook interface requires, and `init` makes it single-use.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 101,\n 120,\n 116,\n 114,\n 97,\n 45,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116,\n 45,\n 109,\n 101,\n 116,\n 97,\n 115\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"cap\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"access_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"credential\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"schema\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"band\",\n \"type\": {\n \"defined\": {\n \"name\": \"PriceBand\"\n }\n }\n },\n {\n \"name\": \"ends_at\",\n \"type\": \"i64\"\n }\n ]\n },\n {\n \"name\": \"execute\",\n \"discriminator\": [\n 105,\n 37,\n 101,\n 197,\n 75,\n 251,\n 102,\n 26\n ],\n \"accounts\": [\n {\n \"name\": \"source_token\",\n \"docs\": [\n \"owning program is checked. Nothing is read from it before that.\"\n ]\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"the rules account is proven to be the one derived from it.\"\n ],\n \"relations\": [\n \"rules\"\n ]\n },\n {\n \"name\": \"destination_token\",\n \"docs\": [\n \"owning program is checked.\"\n ]\n },\n {\n \"name\": \"authority\",\n \"docs\": [\n \"because a signature proves nothing about who is allowed to receive tokens.\"\n ]\n },\n {\n \"name\": \"extra_account_meta_list\",\n \"docs\": [\n \"Token-2022 resolves the extra accounts from it before the call. Pangu itself\",\n \"reads nothing out of it, so it is carried, not trusted.\"\n ]\n },\n {\n \"name\": \"rules\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 97,\n 108,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"destination_record\",\n \"docs\": [\n \"program, discriminator, mint and wallet are all checked by hand below.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"source_record\",\n \"docs\": [\n \"program, discriminator, mint and wallet are all checked by hand below.\"\n ],\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"open_buyer_record\",\n \"discriminator\": [\n 216,\n 212,\n 35,\n 190,\n 138,\n 99,\n 66,\n 197\n ],\n \"accounts\": [\n {\n \"name\": \"wallet\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"mint\"\n },\n {\n \"name\": \"rules\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 97,\n 108,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"record\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 98,\n 117,\n 121,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"wallet\"\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"revoke_buyer\",\n \"discriminator\": [\n 78,\n 97,\n 108,\n 126,\n 172,\n 157,\n 228,\n 134\n ],\n \"accounts\": [\n {\n \"name\": \"issuer\",\n \"signer\": true,\n \"relations\": [\n \"rules\"\n ]\n },\n {\n \"name\": \"mint\",\n \"relations\": [\n \"rules\",\n \"record\"\n ]\n },\n {\n \"name\": \"rules\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 97,\n 108,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"record\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 98,\n 117,\n 121,\n 101,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n },\n {\n \"kind\": \"arg\",\n \"path\": \"wallet\"\n }\n ]\n }\n }\n ],\n \"args\": [\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"BuyerRecord\",\n \"discriminator\": [\n 107,\n 122,\n 54,\n 31,\n 4,\n 54,\n 209,\n 38\n ]\n },\n {\n \"name\": \"SaleRules\",\n \"discriminator\": [\n 39,\n 103,\n 95,\n 70,\n 15,\n 23,\n 201,\n 128\n ]\n }\n ],\n \"events\": [\n {\n \"name\": \"Bought\",\n \"discriminator\": [\n 193,\n 56,\n 215,\n 24,\n 156,\n 76,\n 42,\n 104\n ]\n },\n {\n \"name\": \"BuyerApproved\",\n \"discriminator\": [\n 146,\n 41,\n 51,\n 7,\n 192,\n 96,\n 249,\n 196\n ]\n },\n {\n \"name\": \"BuyerRecordClosed\",\n \"discriminator\": [\n 175,\n 245,\n 14,\n 122,\n 129,\n 113,\n 23,\n 155\n ]\n },\n {\n \"name\": \"BuyerRecordOpened\",\n \"discriminator\": [\n 249,\n 239,\n 77,\n 35,\n 176,\n 81,\n 45,\n 85\n ]\n },\n {\n \"name\": \"BuyerRevoked\",\n \"discriminator\": [\n 116,\n 129,\n 248,\n 92,\n 255,\n 222,\n 13,\n 59\n ]\n },\n {\n \"name\": \"SaleCreated\",\n \"discriminator\": [\n 164,\n 187,\n 32,\n 35,\n 143,\n 167,\n 235,\n 132\n ]\n },\n {\n \"name\": \"SoldBack\",\n \"discriminator\": [\n 153,\n 215,\n 200,\n 12,\n 194,\n 138,\n 190,\n 253\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"NotTransferring\",\n \"msg\": \"Token-2022 is not mid-transfer on both token accounts\"\n },\n {\n \"code\": 6001,\n \"name\": \"ReceivingAccountOwnerCanChange\",\n \"msg\": \"the receiving token account's owner can still be changed\"\n },\n {\n \"code\": 6002,\n \"name\": \"WrongMint\",\n \"msg\": \"the account does not belong to this sale's mint\"\n },\n {\n \"code\": 6003,\n \"name\": \"WrongBuyerRecord\",\n \"msg\": \"the buyer record is not the one for this wallet\"\n },\n {\n \"code\": 6004,\n \"name\": \"BuyerRecordMissing\",\n \"msg\": \"this wallet has no buyer record yet\"\n },\n {\n \"code\": 6005,\n \"name\": \"NotApproved\",\n \"msg\": \"this wallet is not on the issuer's approved list\"\n },\n {\n \"code\": 6006,\n \"name\": \"CredentialInvalid\",\n \"msg\": \"the attestation is not valid for this wallet, credential and schema\"\n },\n {\n \"code\": 6007,\n \"name\": \"CredentialExpired\",\n \"msg\": \"the attestation has expired\"\n },\n {\n \"code\": 6008,\n \"name\": \"CredentialSignerNotAuthorized\",\n \"msg\": \"the key that signed the attestation is no longer an authorized signer\"\n },\n {\n \"code\": 6009,\n \"name\": \"OverCap\",\n \"msg\": \"this buy would take the wallet over the per-wallet cap\"\n },\n {\n \"code\": 6010,\n \"name\": \"WalletToWalletDuringSale\",\n \"msg\": \"the token cannot move between wallets while the sale is running\"\n },\n {\n \"code\": 6011,\n \"name\": \"PriceStale\",\n \"msg\": \"the reference price is too old, missing or not a positive number\"\n },\n {\n \"code\": 6012,\n \"name\": \"PriceOutsideBand\",\n \"msg\": \"the price is outside the allowed band\"\n },\n {\n \"code\": 6013,\n \"name\": \"WrongPriceAccount\",\n \"msg\": \"the price account is not the one named in the rules, or does not hold a usable price\"\n },\n {\n \"code\": 6014,\n \"name\": \"PriceNotFullyVerified\",\n \"msg\": \"the price update has not been signed by two thirds of the guardians\"\n },\n {\n \"code\": 6015,\n \"name\": \"PriceTooUncertain\",\n \"msg\": \"the price carries a wider confidence interval than this sale accepts\"\n },\n {\n \"code\": 6016,\n \"name\": \"NotPoolCreator\",\n \"msg\": \"the signer did not create this pool\"\n },\n {\n \"code\": 6017,\n \"name\": \"NotAHookPool\",\n \"msg\": \"the account is not a DBC transfer-hook pool\"\n },\n {\n \"code\": 6018,\n \"name\": \"HookProgramMismatch\",\n \"msg\": \"the mint's transfer hook does not name this program\"\n },\n {\n \"code\": 6019,\n \"name\": \"MintAuthorityStillSet\",\n \"msg\": \"someone can still mint this token, which would go straight past the cap\"\n },\n {\n \"code\": 6020,\n \"name\": \"WrongLaunchTemplate\",\n \"msg\": \"the launch template is not the one this pool was opened on\"\n },\n {\n \"code\": 6021,\n \"name\": \"FeesNotInQuoteToken\",\n \"msg\": \"the launch template collects fees in the sale token instead of the paying token\"\n },\n {\n \"code\": 6022,\n \"name\": \"ZeroCap\",\n \"msg\": \"the cap must be above zero\"\n },\n {\n \"code\": 6023,\n \"name\": \"InvalidAccessMode\",\n \"msg\": \"that access mode is not available\"\n },\n {\n \"code\": 6024,\n \"name\": \"InvalidBand\",\n \"msg\": \"the price band settings are incomplete, out of range, or set on a sale that has no band\"\n },\n {\n \"code\": 6025,\n \"name\": \"SaleStillRunning\",\n \"msg\": \"the sale is still running, the mint still names this program as its hook\"\n },\n {\n \"code\": 6026,\n \"name\": \"NotIssuer\",\n \"msg\": \"only the issuer can do this\"\n },\n {\n \"code\": 6027,\n \"name\": \"MathOverflow\",\n \"msg\": \"the counter would overflow\"\n },\n {\n \"code\": 6028,\n \"name\": \"WrongLayoutVersion\",\n \"msg\": \"these sale rules were written by another layout of the program\"\n },\n {\n \"code\": 6029,\n \"name\": \"BandNeedsDollarQuote\",\n \"msg\": \"a price band needs buyers to pay in a dollar token on this network's list\"\n },\n {\n \"code\": 6030,\n \"name\": \"IssuerControlsPayingToken\",\n \"msg\": \"the issuer can freeze the paying token, which would let them stop sellers being paid\"\n },\n {\n \"code\": 6031,\n \"name\": \"CapCoversWholeSale\",\n \"msg\": \"the cap is at or above everything the curve sells, so it limits nobody\"\n },\n {\n \"code\": 6032,\n \"name\": \"EndInThePast\",\n \"msg\": \"the offering period would end at a time that has already passed\"\n }\n ],\n \"types\": [\n {\n \"name\": \"Bought\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"net_bought\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"BuyerApproved\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"BuyerRecord\",\n \"docs\": [\n \"One wallet's standing in one sale. Keyed on the wallet that owns the token\",\n \"account, never on the token account, so extra token accounts share one cap.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"approved\",\n \"type\": \"bool\"\n },\n {\n \"name\": \"net_bought\",\n \"docs\": [\n \"Tokens received from the pool minus tokens sold back to it.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"BuyerRecordClosed\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"BuyerRecordOpened\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"BuyerRevoked\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"PriceBand\",\n \"docs\": [\n \"The price band settings, passed to `create_sale` as one value.\",\n \"\",\n \"They travel together because they are only meaningful together: the price\",\n \"account's address is derived from the shard id and the feed id, so changing\",\n \"either one changes which account the hook must read.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"band_bps\",\n \"docs\": [\n \"How far above the live stock price a buy may leave the curve price, in\",\n \"basis points. Zero switches the whole band off.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"price_account\",\n \"docs\": [\n \"The Pyth price feed account. Must be the address the shard id and the feed\",\n \"id below produce under Pyth's price feed program.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"price_feed_id\",\n \"docs\": [\n \"The Pyth feed carrying the stock price in dollars.\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"price_shard\",\n \"docs\": [\n \"Which of Pyth's shards this sale reads. A shard is just a second copy of\",\n \"the same feed at a second address, so a sale can depend on a price its own\",\n \"refresher keeps fresh rather than on Pyth's sponsored one.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_price_age_secs\",\n \"docs\": [\n \"How old the published price may be on a buy, in seconds.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"max_conf_bps\",\n \"docs\": [\n \"The widest confidence interval this sale will buy against, in basis points\",\n \"of the price itself.\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"SaleCreated\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"issuer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"base_vault\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cap\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"access_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"band_bps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"quote_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"ends_at\",\n \"docs\": [\n \"Unix seconds when the offering period ends and every rule lifts. Zero\",\n \"means the rules hold until graduation.\"\n ],\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"SaleRules\",\n \"docs\": [\n \"The rules of one sale. Written once at creation and never changed: there is no\",\n \"update instruction, which is what makes the cap a promise instead of a setting.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"base_vault\",\n \"docs\": [\n \"The pool's base token vault, read out of the pool account at creation. The\",\n \"hook tells a buy from a sell by comparing against this one address.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"issuer\",\n \"docs\": [\n \"The pool creator. The only key that can approve or revoke buyers.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cap\",\n \"docs\": [\n \"Most tokens one wallet may hold net of sells, in raw units.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"access_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"credential\",\n \"docs\": [\n \"Mode 2 only: the attestation credential whose approvals count. Zero\",\n \"otherwise. Sits at byte 145 of the account, and the hook's extra accounts\",\n \"are derived by reading it there, so it can never move.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"schema\",\n \"docs\": [\n \"Mode 2 only: the attestation schema that counts. Zero otherwise. Sits at\",\n \"byte 177 of the account, read the same way.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"price_account\",\n \"docs\": [\n \"Band only: the Pyth price feed account, at byte 209. Zero otherwise.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"price_feed_id\",\n \"docs\": [\n \"Band only: the Pyth feed the price account must carry, at byte 241.\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"price_shard\",\n \"docs\": [\n \"Band only: the Pyth shard the price account was derived under.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"band_bps\",\n \"docs\": [\n \"Zero means no band.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_price_age_secs\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"max_conf_bps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"base_decimals\",\n \"docs\": [\n \"Read off the two mints at creation, so the curve price can be turned into\",\n \"dollars per whole token without trusting anything passed at buy time.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"quote_decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"buyers\",\n \"docs\": [\n \"Wallets whose record is above zero right now.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"total_net_bought\",\n \"docs\": [\n \"Sum of every record, so the app can show the largest holder's share.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"layout_version\",\n \"docs\": [\n \"Which layout wrote this account, at byte 298. It takes the first of what\",\n \"used to be the spare bytes, so the account is the same size and every\",\n \"field in front of it sits exactly where it always did. A sale opened\",\n \"before this byte existed reads as version 0, which is how a reader tells\",\n \"the two apart instead of reading one layout's bytes as the other's.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"quote_mint\",\n \"docs\": [\n \"The token buyers pay in, read from the launch template at creation, at\",\n \"byte 299. Layout 2 onwards; a version 1 account holds zeros here.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"ends_at\",\n \"docs\": [\n \"Unix seconds at which the offering period ends, at byte 331. From then on\",\n \"every rule lifts and the token moves freely, so a curve that never fills\",\n \"cannot hold the token in place for good. Zero means no end: the rules hold\",\n \"until graduation. Fixed at creation like every other rule.\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"reserved\",\n \"type\": {\n \"array\": [\n \"u8\",\n 23\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"SoldBack\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"wallet\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"net_bought\",\n \"type\": \"u64\"\n }\n ]\n }\n }\n ]\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\n/**\n * Thrown before anything is built when an input could never pass on chain.\n *\n * Every message names the rule and the value, because the caller is usually a\n * form in the app and the text goes straight to the person filling it in.\n */\nexport class PanguInputError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PanguInputError\";\n }\n}\n\nexport function requirePublicKey(value: unknown, field: string): PublicKey {\n if (!(value instanceof PublicKey)) {\n throw new PanguInputError(`${field} must be a PublicKey`);\n }\n return value;\n}\n\n/** A key that is present and is not the all zero address the program reads as \"unset\". */\nexport function requireRealPublicKey(value: unknown, field: string): PublicKey {\n const key = requirePublicKey(value, field);\n if (key.equals(PublicKey.default)) {\n throw new PanguInputError(`${field} must not be the all zero address`);\n }\n return key;\n}\n\nexport function requireAbsent(value: unknown, field: string, reason: string): void {\n if (value !== undefined && value !== null) {\n throw new PanguInputError(`${field} ${reason}`);\n }\n}\n\n/** An unsigned whole number inside the range the program's own field can hold. */\nexport function requireWholeNumber(\n value: unknown,\n field: string,\n low: number,\n high: number\n): number {\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new PanguInputError(`${field} must be a whole number`);\n }\n if (value < low || value > high) {\n throw new PanguInputError(`${field} must be between ${low} and ${high}, got ${value}`);\n }\n return value;\n}\n\nexport function requireBigint(value: unknown, field: string): bigint {\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return BigInt(value);\n }\n throw new PanguInputError(`${field} must be a bigint`);\n}\n"],"mappings":"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","names":["import_web3","import_web3","body"]}
|