@rialo/spl-token 0.3.0-alpha.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/instructions/create-ata.ts","../src/test-helpers.ts","../src/instructions/mint.ts","../src/instructions/transfer.ts","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/sha2.ts","../src/pda/ata.ts","../src/state/mint.ts","../src/state/token-account.ts","../src/state/metadata.ts","../src/client/spl-token-client.ts"],"names":["TokenAccountState","ExtensionType","AccountType","TokenInstruction","SplTokenErrorCode","PublicKey","writeU64LE","readU64LE","readU32LE","readCOptionPubkey"],"mappings":"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","file":"index.mjs","sourcesContent":["// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Constants for SPL Token-2022 operations.\n *\n * This module defines program IDs, byte offsets for account parsing,\n * and instruction discriminators for the Token-2022 program.\n */\n\n// =============================================================================\n// Program IDs (Canonical Solana/Rialo Addresses)\n// =============================================================================\n\n/** Token-2022 program ID */\nexport const TOKEN_2022_PROGRAM_ID = \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\";\n\n/** Associated Token Account program ID */\nexport const ASSOCIATED_TOKEN_PROGRAM_ID = \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\";\n\n/** Legacy Token program ID (SPL Token) */\nexport const TOKEN_PROGRAM_ID = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\";\n\n// =============================================================================\n// Account Sizes\n// =============================================================================\n\n/** Size of a Mint account (without extensions) */\nexport const MINT_SIZE = 82;\n\n/** Size of a Token Account (without extensions) */\nexport const TOKEN_ACCOUNT_SIZE = 165;\n\n// =============================================================================\n// Mint Account Offsets (82 bytes total)\n// =============================================================================\n\n/** Byte offset for mint_authority COption<Pubkey> (36 bytes) */\nexport const MINT_AUTHORITY_OFFSET = 0;\n\n/** Byte offset for supply u64 (8 bytes) */\nexport const MINT_SUPPLY_OFFSET = 36;\n\n/** Byte offset for decimals u8 (1 byte) */\nexport const MINT_DECIMALS_OFFSET = 44;\n\n/** Byte offset for is_initialized bool (1 byte) */\nexport const MINT_IS_INITIALIZED_OFFSET = 45;\n\n/** Byte offset for freeze_authority COption<Pubkey> (36 bytes) */\nexport const MINT_FREEZE_AUTHORITY_OFFSET = 46;\n\n// =============================================================================\n// Token Account Offsets (165 bytes total)\n// =============================================================================\n\n/** Byte offset for mint Pubkey (32 bytes) */\nexport const TOKEN_ACCOUNT_MINT_OFFSET = 0;\n\n/** Byte offset for owner Pubkey (32 bytes) */\nexport const TOKEN_ACCOUNT_OWNER_OFFSET = 32;\n\n/** Byte offset for amount u64 (8 bytes) */\nexport const TOKEN_ACCOUNT_AMOUNT_OFFSET = 64;\n\n/** Byte offset for delegate COption<Pubkey> (36 bytes) */\nexport const TOKEN_ACCOUNT_DELEGATE_OFFSET = 72;\n\n/** Byte offset for state u8 (1 byte) */\nexport const TOKEN_ACCOUNT_STATE_OFFSET = 108;\n\n/** Byte offset for is_native COption<u64> (12 bytes) */\nexport const TOKEN_ACCOUNT_IS_NATIVE_OFFSET = 109;\n\n/** Byte offset for delegated_amount u64 (8 bytes) */\nexport const TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET = 121;\n\n/** Byte offset for close_authority COption<Pubkey> (36 bytes) */\nexport const TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET = 129;\n\n// =============================================================================\n// COption Format\n// =============================================================================\n\n/** Size of COption tag (4-byte LE u32) */\nexport const COPTION_TAG_SIZE = 4;\n\n/** COption tag value for None */\nexport const COPTION_NONE = 0;\n\n/** COption tag value for Some */\nexport const COPTION_SOME = 1;\n\n/** Size of Pubkey in bytes */\nexport const PUBKEY_SIZE = 32;\n\n// =============================================================================\n// Token Account State Enum\n// =============================================================================\n\n/**\n * State of a token account.\n */\nexport enum TokenAccountState {\n /** Account is not yet initialized */\n Uninitialized = 0,\n /** Account is initialized and active */\n Initialized = 1,\n /** Account is frozen */\n Frozen = 2,\n}\n\n// =============================================================================\n// Extension Types (TLV format)\n// =============================================================================\n\n/**\n * Extension types for Token-2022 accounts.\n * Extensions start after the base account data with an AccountType byte.\n */\nexport enum ExtensionType {\n /** Uninitialized extension slot */\n Uninitialized = 0,\n /** Transfer fee configuration */\n TransferFeeConfig = 1,\n /** Transfer fee amount tracking */\n TransferFeeAmount = 2,\n /** Mint close authority */\n MintCloseAuthority = 3,\n /** Confidential transfer configuration */\n ConfidentialTransferMint = 4,\n /** Confidential transfer account state */\n ConfidentialTransferAccount = 5,\n /** Default account state */\n DefaultAccountState = 6,\n /** Immutable owner */\n ImmutableOwner = 7,\n /** Memo required on transfer */\n MemoTransfer = 8,\n /** Non-transferable tokens */\n NonTransferable = 9,\n /** Interest-bearing configuration */\n InterestBearingConfig = 10,\n /** CPI guard */\n CpiGuard = 11,\n /** Permanent delegate */\n PermanentDelegate = 12,\n /** Non-transferable account marker */\n NonTransferableAccount = 13,\n /** Transfer hook configuration */\n TransferHook = 14,\n /** Transfer hook account state */\n TransferHookAccount = 15,\n /** Confidential transfer fee configuration */\n ConfidentialTransferFeeConfig = 16,\n /** Confidential transfer fee amount */\n ConfidentialTransferFeeAmount = 17,\n /** Metadata pointer extension */\n MetadataPointer = 18,\n /** Token metadata extension */\n TokenMetadata = 19,\n /** Group pointer extension */\n GroupPointer = 20,\n /** Token group extension */\n TokenGroup = 21,\n /** Group member pointer extension */\n GroupMemberPointer = 22,\n /** Token group member extension */\n TokenGroupMember = 23,\n}\n\n// =============================================================================\n// Account Type (for extensions)\n// =============================================================================\n\n/**\n * Account type byte that precedes extensions.\n */\nexport enum AccountType {\n /** Account is uninitialized */\n Uninitialized = 0,\n /** This is a mint account */\n Mint = 1,\n /** This is a token account */\n Account = 2,\n}\n\n// =============================================================================\n// Instruction Discriminators\n// =============================================================================\n\n/**\n * SPL Token instruction discriminators.\n */\nexport enum TokenInstruction {\n /** Initialize a new mint */\n InitializeMint = 0,\n /** Initialize a new token account */\n InitializeAccount = 1,\n /** Initialize a multisig */\n InitializeMultisig = 2,\n /** Transfer tokens (deprecated, use TransferChecked) */\n Transfer = 3,\n /** Approve a delegate */\n Approve = 4,\n /** Revoke a delegate */\n Revoke = 5,\n /** Set a new authority */\n SetAuthority = 6,\n /** Mint new tokens */\n MintTo = 7,\n /** Burn tokens */\n Burn = 8,\n /** Close a token account */\n CloseAccount = 9,\n /** Freeze a token account */\n FreezeAccount = 10,\n /** Thaw a frozen account */\n ThawAccount = 11,\n /** Transfer tokens with decimals check */\n TransferChecked = 12,\n /** Approve with amount check */\n ApproveChecked = 13,\n /** Mint with amount check */\n MintToChecked = 14,\n /** Burn with amount check */\n BurnChecked = 15,\n /** Initialize account with specified owner */\n InitializeAccount2 = 16,\n /** Sync native token balance */\n SyncNative = 17,\n /** Initialize account with rent sysvar */\n InitializeAccount3 = 18,\n /** Initialize multisig with rent sysvar */\n InitializeMultisig2 = 19,\n /** Initialize mint with rent sysvar */\n InitializeMint2 = 20,\n}\n\n// =============================================================================\n// TLV (Type-Length-Value) Constants\n// =============================================================================\n\n/** Size of extension type field in TLV (2 bytes LE u16) */\nexport const TLV_TYPE_SIZE = 2;\n\n/** Size of extension length field in TLV (2 bytes LE u16) */\nexport const TLV_LENGTH_SIZE = 2;\n\n/** Offset where extensions begin in a mint account */\nexport const MINT_EXTENSIONS_OFFSET = MINT_SIZE + 1; // +1 for AccountType byte\n\n/** Offset where extensions begin in a token account */\nexport const TOKEN_ACCOUNT_EXTENSIONS_OFFSET = TOKEN_ACCOUNT_SIZE + 1; // +1 for AccountType byte\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Error handling for SPL Token operations.\n *\n * This module defines the error types and factory methods for all\n * SPL Token-related operations, following the same pattern as RialoError.\n */\n\n/**\n * Error codes for SPL Token operations.\n */\nexport enum SplTokenErrorCode {\n /** Invalid mint account data */\n INVALID_MINT = \"INVALID_MINT\",\n /** Invalid token account data */\n INVALID_TOKEN_ACCOUNT = \"INVALID_TOKEN_ACCOUNT\",\n /** Token account not found */\n TOKEN_ACCOUNT_NOT_FOUND = \"TOKEN_ACCOUNT_NOT_FOUND\",\n /** Mint account not found */\n MINT_NOT_FOUND = \"MINT_NOT_FOUND\",\n /** Token account is frozen */\n ACCOUNT_FROZEN = \"ACCOUNT_FROZEN\",\n /** Insufficient token balance */\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n /** Invalid extension data */\n INVALID_EXTENSION = \"INVALID_EXTENSION\",\n /** PDA derivation failed */\n PDA_DERIVATION_FAILED = \"PDA_DERIVATION_FAILED\",\n /** Invalid metadata */\n INVALID_METADATA = \"INVALID_METADATA\",\n /** Account not initialized */\n ACCOUNT_NOT_INITIALIZED = \"ACCOUNT_NOT_INITIALIZED\",\n}\n\n/**\n * Constructor options for SplTokenError.\n */\nexport interface SplTokenErrorOptions {\n code: SplTokenErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Error class for SPL Token operations.\n *\n * Provides structured error handling with error codes and optional details.\n * Use the static factory methods for consistent error creation.\n *\n * @example\n * ```typescript\n * // Create errors using factory methods\n * throw SplTokenError.invalidMint({ reason: \"Account data too short\" });\n * throw SplTokenError.tokenAccountNotFound({ address: \"5ZqB9U...\" });\n * throw SplTokenError.insufficientBalance({ required: 1000n, available: 500n });\n *\n * // Handle errors with type information\n * try {\n * await client.getBalance({ wallet, mint });\n * } catch (error) {\n * if (error instanceof SplTokenError && error.code === SplTokenErrorCode.TOKEN_ACCOUNT_NOT_FOUND) {\n * console.log(\"Token account does not exist\");\n * }\n * }\n * ```\n */\nexport class SplTokenError extends Error {\n public readonly code: SplTokenErrorCode;\n public readonly details?: Record<string, unknown>;\n\n public constructor({ code, message, details }: SplTokenErrorOptions) {\n super(message);\n this.name = \"SplTokenError\";\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SplTokenError);\n }\n }\n\n /**\n * Creates an invalid mint error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidMint({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_MINT,\n message: `Invalid mint: ${reason}`,\n });\n }\n\n /**\n * Creates an invalid token account error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidTokenAccount({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_TOKEN_ACCOUNT,\n message: `Invalid token account: ${reason}`,\n });\n }\n\n /**\n * Creates a token account not found error.\n *\n * @param options - Error options containing the address\n */\n public static tokenAccountNotFound({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.TOKEN_ACCOUNT_NOT_FOUND,\n message: `Token account not found: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates a mint not found error.\n *\n * @param options - Error options containing the address\n */\n public static mintNotFound({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.MINT_NOT_FOUND,\n message: `Mint not found: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates an account frozen error.\n *\n * @param options - Error options containing the address\n */\n public static accountFrozen({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.ACCOUNT_FROZEN,\n message: `Token account is frozen: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates an insufficient balance error.\n *\n * @param options - Error options containing required and available amounts\n */\n public static insufficientBalance({\n required,\n available,\n }: {\n required: bigint;\n available: bigint;\n }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INSUFFICIENT_BALANCE,\n message: `Insufficient balance: required ${required}, available ${available}`,\n details: { required: required.toString(), available: available.toString() },\n });\n }\n\n /**\n * Creates an invalid extension error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidExtension({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_EXTENSION,\n message: `Invalid extension: ${reason}`,\n });\n }\n\n /**\n * Creates a PDA derivation failed error.\n *\n * @param options - Error options containing the reason\n */\n public static pdaDerivationFailed({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.PDA_DERIVATION_FAILED,\n message: `PDA derivation failed: ${reason}`,\n });\n }\n\n /**\n * Creates an invalid metadata error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidMetadata({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_METADATA,\n message: `Invalid metadata: ${reason}`,\n });\n }\n\n /**\n * Creates an account not initialized error.\n *\n * @param options - Error options containing the address\n */\n public static accountNotInitialized({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.ACCOUNT_NOT_INITIALIZED,\n message: `Account not initialized: ${address}`,\n details: { address },\n });\n }\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Create Associated Token Account instruction for SPL Token-2022.\n *\n * Creates an Associated Token Account (ATA) for a wallet and mint combination.\n */\n\nimport { PublicKey, SYSTEM_PROGRAM_ID } from \"@rialo/ts-cdk\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\n\n/**\n * Options for creating an Associated Token Account instruction.\n */\nexport interface CreateAssociatedTokenAccountInstructionOptions {\n /** Account paying for the new account's rent */\n payer: PublicKey;\n /** The ATA address (derived via findAssociatedTokenAddress) */\n associatedToken: PublicKey;\n /** The wallet that will own the new token account */\n owner: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an instruction to create an Associated Token Account.\n *\n * The ATA is a PDA derived from the wallet, token program, and mint.\n * This instruction will create the account if it doesn't exist.\n *\n * Note: This instruction has no data - all information is in the accounts.\n *\n * @param options - Options for the instruction\n * @returns The CreateAssociatedTokenAccount instruction\n *\n * @example\n * ```typescript\n * const { address: ata } = findAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n *\n * const instruction = createAssociatedTokenAccountInstruction({\n * payer: payerPubkey,\n * associatedToken: ata,\n * owner: walletPubkey,\n * mint: mintPubkey,\n * });\n *\n * const tx = TransactionBuilder.create()\n * .setPayer(payerPubkey)\n * .addInstruction(instruction)\n * .build();\n * ```\n */\nexport function createAssociatedTokenAccountInstruction({\n payer,\n associatedToken,\n owner,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: CreateAssociatedTokenAccountInstructionOptions): Instruction {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n const systemProgramId = PublicKey.fromString(SYSTEM_PROGRAM_ID);\n\n // Account order for CreateAssociatedTokenAccount:\n // 0. [writable, signer] Funding account (payer)\n // 1. [writable] Associated token account address (to be created)\n // 2. [] Wallet address (owner of the new account)\n // 3. [] Token mint\n // 4. [] System program\n // 5. [] Token program\n\n return {\n programId: associatedTokenProgramId,\n accounts: [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: associatedToken, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: systemProgramId, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ],\n // CreateAssociatedTokenAccount has no instruction data\n data: new Uint8Array(0),\n };\n}\n\n/**\n * Options for creating an idempotent Associated Token Account instruction.\n */\nexport interface CreateAssociatedTokenAccountIdempotentInstructionOptions {\n /** Account paying for the new account's rent */\n payer: PublicKey;\n /** The ATA address (derived via findAssociatedTokenAddress) */\n associatedToken: PublicKey;\n /** The wallet that will own the new token account */\n owner: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an instruction to create an Associated Token Account idempotently.\n *\n * This variant will succeed even if the ATA already exists, making it safe\n * to call without checking if the account exists first.\n *\n * @param options - Options for the instruction\n * @returns The CreateAssociatedTokenAccountIdempotent instruction\n *\n * @example\n * ```typescript\n * // Safe to call even if ATA already exists\n * const instruction = createAssociatedTokenAccountIdempotentInstruction({\n * payer: payerPubkey,\n * associatedToken: ata,\n * owner: walletPubkey,\n * mint: mintPubkey,\n * });\n * ```\n */\nexport function createAssociatedTokenAccountIdempotentInstruction({\n payer,\n associatedToken,\n owner,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: CreateAssociatedTokenAccountIdempotentInstructionOptions): Instruction {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n const systemProgramId = PublicKey.fromString(SYSTEM_PROGRAM_ID);\n\n return {\n programId: associatedTokenProgramId,\n accounts: [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: associatedToken, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: systemProgramId, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ],\n // Idempotent variant uses instruction discriminator 1\n data: new Uint8Array([1]),\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function writeU16LE({\n data,\n offset,\n value,\n}: { data: Uint8Array; offset: number; value: number }): void {\n data[offset] = value & 0xff;\n data[offset + 1] = (value >> 8) & 0xff;\n}\n\nexport function writeU32LE({\n data,\n offset,\n value,\n}: { data: Uint8Array; offset: number; value: number }): void {\n data[offset] = value & 0xff;\n data[offset + 1] = (value >> 8) & 0xff;\n data[offset + 2] = (value >> 16) & 0xff;\n data[offset + 3] = (value >> 24) & 0xff;\n}\n\nexport function writeU64LE({\n data,\n offset,\n value,\n}: { data: Uint8Array; offset: number; value: bigint }): void {\n for (let i = 0; i < 8; i++) {\n data[offset + i] = Number((value >> BigInt(i * 8)) & 0xffn);\n }\n}\n\nexport function writeLengthPrefixedString({\n data,\n offset,\n str,\n}: { data: Uint8Array; offset: number; str: string }): number {\n const encoded = new TextEncoder().encode(str);\n writeU32LE({ data, offset, value: encoded.length });\n data.set(encoded, offset + 4);\n return 4 + encoded.length;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport { writeU64LE } from \"../test-helpers\";\nimport type { Instruction } from \"./transfer\";\n\n/**\n * Options for creating an InitializeMint2 instruction.\n *\n * InitializeMint2 does not require a rent sysvar account, but does require\n * the tombstone PDA derived from [\"mint_tombstone\", mint_pubkey].\n */\nexport interface InitializeMintInstructionOptions {\n\t/** Mint account to initialize */\n\tmint: PublicKey;\n\t/** Number of decimals for the mint */\n\tdecimals: number;\n\t/** Authority allowed to mint new tokens */\n\tmintAuthority: PublicKey;\n\t/** Optional freeze authority for the mint */\n\tfreezeAuthority?: PublicKey;\n\t/** Token program ID (defaults to Token-2022) */\n\tprogramId?: PublicKey;\n}\n\n/**\n * Creates an InitializeMint2 instruction for Token-2022.\n *\n * Instruction data format:\n * [discriminator(1), decimals(1), mint_authority(32), freeze_option(1), freeze_authority(32)]\n *\n * Accounts:\n * - mint (writable)\n * - tombstone_pda (readonly)\n *\n * @param options - Options for the instruction\n * @returns The InitializeMint2 instruction\n *\n * @example\n * ```typescript\n * const instruction = initializeMintInstruction({\n * mint,\n * decimals: 6,\n * mintAuthority,\n * freezeAuthority,\n * });\n * ```\n */\nexport function initializeMintInstruction({\n\tmint,\n\tdecimals,\n\tmintAuthority,\n\tfreezeAuthority,\n\tprogramId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeMintInstructionOptions): Instruction {\n\t// SPL Token uses 1-byte discriminator: [discriminator(1), decimals(1), mint_authority(32), freeze_option(1), freeze_authority(32)]\n\tconst data = new Uint8Array(67);\n\n\tdata[0] = TokenInstruction.InitializeMint2; // 20\n\tdata[1] = decimals;\n\tdata.set(mintAuthority.toBytes(), 2);\n\n\tif (freezeAuthority) {\n\t\tdata[34] = 1; // COption::Some\n\t\tdata.set(freezeAuthority.toBytes(), 35);\n\t} else {\n\t\tdata[34] = 0; // COption::None\n\t\t// bytes 35-66 remain zeroed\n\t}\n\n\t// Derive tombstone PDA: seeds = [\"mint_tombstone\", mint_pubkey]\n\tconst [tombstonePda] = PublicKey.findProgramAddress(\n\t\t[\"mint_tombstone\", mint.toBytes()],\n\t\tprogramId,\n\t);\n\n\treturn {\n\t\tprogramId,\n\t\taccounts: [\n\t\t\t{ pubkey: mint, isSigner: false, isWritable: true },\n\t\t\t{ pubkey: tombstonePda, isSigner: false, isWritable: false },\n\t\t],\n\t\tdata,\n\t};\n}\n\n/**\n * Options for creating a MintTo instruction.\n */\nexport interface MintToInstructionOptions {\n\t/** Mint account to mint tokens from */\n\tmint: PublicKey;\n\t/** Destination token account to receive minted tokens */\n\tdestination: PublicKey;\n\t/** Mint authority (signer) */\n\tauthority: PublicKey;\n\t/** Amount to mint in smallest units */\n\tamount: bigint;\n\t/** Token program ID (defaults to Token-2022) */\n\tprogramId?: PublicKey;\n}\n\n/**\n * Creates a MintTo instruction for Token-2022.\n *\n * Instruction data format: [discriminator(1), amount(8 LE)]\n *\n * Accounts:\n * - mint (writable)\n * - destination (writable)\n * - authority (signer)\n *\n * @param options - Options for the instruction\n * @returns The MintTo instruction\n *\n * @example\n * ```typescript\n * const instruction = mintToInstruction({\n * mint,\n * destination,\n * authority,\n * amount: 1_000_000n,\n * });\n * ```\n */\nexport function mintToInstruction({\n\tmint,\n\tdestination,\n\tauthority,\n\tamount,\n\tprogramId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: MintToInstructionOptions): Instruction {\n\tconst data = new Uint8Array(9);\n\tdata[0] = TokenInstruction.MintTo; // 7\n\twriteU64LE({ data, offset: 1, value: amount });\n\n\treturn {\n\t\tprogramId,\n\t\taccounts: [\n\t\t\t{ pubkey: mint, isSigner: false, isWritable: true },\n\t\t\t{ pubkey: destination, isSigner: false, isWritable: true },\n\t\t\t{ pubkey: authority, isSigner: true, isWritable: false },\n\t\t],\n\t\tdata,\n\t};\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * TransferChecked instruction for SPL Token-2022.\n *\n * TransferChecked is the preferred transfer instruction as it includes\n * a decimals check to prevent user error.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\n\n/**\n * Account metadata for an instruction account.\n */\nexport interface AccountMeta {\n /** The account's public key */\n pubkey: PublicKey;\n /** Whether this account must sign the transaction */\n isSigner: boolean;\n /** Whether this account's data can be modified */\n isWritable: boolean;\n}\n\n/**\n * A single instruction to be included in a transaction.\n */\nexport interface Instruction {\n /** The program that will process this instruction */\n programId: PublicKey;\n /** Accounts required by this instruction */\n accounts: AccountMeta[];\n /** Instruction data */\n data: Uint8Array;\n}\n\n/**\n * Writes a little-endian u64 to a Uint8Array at the specified offset.\n */\nfunction writeU64LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: bigint;\n}): void {\n for (let i = 0; i < 8; i++) {\n data[offset + i] = Number((value >> BigInt(i * 8)) & 0xffn);\n }\n}\n\n/**\n * Options for creating a TransferChecked instruction.\n */\nexport interface TransferCheckedInstructionOptions {\n /** Source token account (must be owned by authority) */\n source: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Destination token account */\n destination: PublicKey;\n /** Owner of the source account (signer) */\n authority: PublicKey;\n /** Amount to transfer in smallest units */\n amount: bigint;\n /** Expected decimals of the mint (for verification) */\n decimals: number;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a TransferChecked instruction.\n *\n * TransferChecked transfers tokens from one token account to another,\n * with a decimals check to prevent accidental transfers of the wrong amount.\n *\n * Instruction data format: [discriminator(1), amount(8 LE), decimals(1)]\n *\n * @param options - Options for the instruction\n * @returns The TransferChecked instruction\n *\n * @example\n * ```typescript\n * const instruction = transferCheckedInstruction({\n * source: sourceTokenAccount,\n * mint: mintPubkey,\n * destination: destinationTokenAccount,\n * authority: walletPubkey,\n * amount: 1000000n, // 1 token with 6 decimals\n * decimals: 6,\n * });\n *\n * const tx = TransactionBuilder.create()\n * .setPayer(walletPubkey)\n * .addInstruction(instruction)\n * .build();\n * ```\n */\nexport function transferCheckedInstruction({\n source,\n mint,\n destination,\n authority,\n amount,\n decimals,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: TransferCheckedInstructionOptions): Instruction {\n // Instruction data: [discriminator(1), amount(8), decimals(1)]\n const data = new Uint8Array(10);\n\n // Write discriminator (TransferChecked = 12)\n data[0] = TokenInstruction.TransferChecked;\n\n // Write amount as little-endian u64\n writeU64LE({ data, offset: 1, value: amount });\n\n // Write decimals\n data[9] = decimals;\n\n return {\n programId,\n accounts: [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: true, isWritable: false },\n ],\n data,\n };\n}\n\n/**\n * Options for creating a Transfer instruction.\n */\nexport interface TransferInstructionOptions {\n /** Source token account */\n source: PublicKey;\n /** Destination token account */\n destination: PublicKey;\n /** Owner of the source account (signer) */\n authority: PublicKey;\n /** Amount to transfer in smallest units */\n amount: bigint;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a Transfer instruction (deprecated, prefer TransferChecked).\n *\n * This is the legacy transfer instruction without decimals verification.\n * Use transferCheckedInstruction instead for safety.\n *\n * @param options - Options for the instruction\n * @returns The Transfer instruction\n */\nexport function transferInstruction({\n source,\n destination,\n authority,\n amount,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: TransferInstructionOptions): Instruction {\n // Instruction data: [discriminator(1), amount(8)]\n const data = new Uint8Array(9);\n\n // Write discriminator (Transfer = 3)\n data[0] = TokenInstruction.Transfer;\n\n // Write amount as little-endian u64\n writeU64LE({ data, offset: 1, value: amount });\n\n return {\n programId,\n accounts: [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: true, isWritable: false },\n ],\n data,\n };\n}\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number, title: string = ''): void {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >0, got ${n}`);\n }\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts something is hash */\nexport function ahash(h: CHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput, errorTitle = ''): Uint8Array {\n if (typeof data === 'string') return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\n/** Merges default options and passed options. */\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Common interface for all hashes. */\nexport interface Hash<T> {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: Uint8Array): this;\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n destroy(): void;\n _cloneInto(to?: T): T;\n clone(): T;\n}\n\n/** PseudoRandom (number) Generator */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash constructor */\nexport type HasherCons<T, Opts = undefined> = Opts extends undefined ? () => T : (opts?: Opts) => T;\n/** Optional hash params. */\nexport type HashInfo = {\n oid?: Uint8Array; // DER encoded OID in bytes\n};\n/** Hash function */\nexport type CHash<T extends Hash<T> = Hash<any>, Opts = undefined> = {\n outputLen: number;\n blockLen: number;\n} & HashInfo &\n (Opts extends undefined\n ? {\n (msg: Uint8Array): Uint8Array;\n create(): T;\n }\n : {\n (msg: Uint8Array, opts?: Opts): Uint8Array;\n create(opts?: Opts): T;\n });\n/** XOF with output */\nexport type CHashXOF<T extends HashXOF<T> = HashXOF<any>, Opts = undefined> = CHash<T, Opts>;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher<T extends Hash<T>, Opts = undefined>(\n hashCons: HasherCons<T, Opts>,\n info: HashInfo = {}\n): CHash<T, Opts> {\n const hashC: any = (msg: Uint8Array, opts?: Opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: Opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix: number): Required<HashInfo> => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView, type Hash } from './utils.ts';\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> implements Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to as unknown as any;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, oidNist, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n\n/** Internal 32-byte base SHA2 hash class. */\nabstract class SHA2_32B<T extends SHA2_32B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected abstract A: number;\n protected abstract B: number;\n protected abstract C: number;\n protected abstract D: number;\n protected abstract E: number;\n protected abstract F: number;\n protected abstract G: number;\n protected abstract H: number;\n\n constructor(outputLen: number) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B<_SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B<_SHA224> {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal 64-byte base SHA2 hash class. */\nabstract class SHA2_64B<T extends SHA2_64B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected abstract Ah: number;\n protected abstract Al: number;\n protected abstract Bh: number;\n protected abstract Bl: number;\n protected abstract Ch: number;\n protected abstract Cl: number;\n protected abstract Dh: number;\n protected abstract Dl: number;\n protected abstract Eh: number;\n protected abstract El: number;\n protected abstract Fh: number;\n protected abstract Fl: number;\n protected abstract Gh: number;\n protected abstract Gl: number;\n protected abstract Hh: number;\n protected abstract Hl: number;\n\n constructor(outputLen: number) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B<_SHA512> {\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor() {\n super(64);\n }\n}\n\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B<_SHA384> {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B<_SHA512_224> {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B<_SHA512_256> {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256: CHash<_SHA256> = /* @__PURE__ */ createHasher(\n () => new _SHA256(),\n /* @__PURE__ */ oidNist(0x01)\n);\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash<_SHA224> = /* @__PURE__ */ createHasher(\n () => new _SHA224(),\n /* @__PURE__ */ oidNist(0x04)\n);\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash<_SHA512> = /* @__PURE__ */ createHasher(\n () => new _SHA512(),\n /* @__PURE__ */ oidNist(0x03)\n);\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash<_SHA384> = /* @__PURE__ */ createHasher(\n () => new _SHA384(),\n /* @__PURE__ */ oidNist(0x02)\n);\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash<_SHA512_256> = /* @__PURE__ */ createHasher(\n () => new _SHA512_256(),\n /* @__PURE__ */ oidNist(0x06)\n);\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash<_SHA512_224> = /* @__PURE__ */ createHasher(\n () => new _SHA512_224(),\n /* @__PURE__ */ oidNist(0x05)\n);\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Associated Token Address (ATA) derivation for SPL Token-2022.\n *\n * ATAs are Program Derived Addresses (PDAs) that provide a deterministic\n * token account address for any wallet/mint combination.\n */\n\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { isOnCurve, PublicKey } from \"@rialo/ts-cdk\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { AtaDerivationResult } from \"../types\";\n\n/**\n * Creates a Program Derived Address (PDA).\n *\n * @param options - Options containing seeds and programId\n * @returns The derived address and bump seed, or null if no valid bump found\n */\nfunction createProgramAddress({\n seeds,\n programId,\n}: {\n seeds: Uint8Array[];\n programId: PublicKey;\n}): { address: PublicKey; bump: number } | null {\n // Try bump values from 255 down to 0\n for (let bump = 255; bump >= 0; bump--) {\n const bumpSeed = new Uint8Array([bump]);\n\n // Concatenate all seeds + bump + program_id + \"ProgramDerivedAddress\"\n const allSeeds = [...seeds, bumpSeed];\n const programIdBytes = programId.toBytes();\n const pda_marker = new TextEncoder().encode(\"ProgramDerivedAddress\");\n\n // Calculate total length\n let totalLength = 0;\n for (const seed of allSeeds) {\n totalLength += seed.length;\n }\n totalLength += programIdBytes.length + pda_marker.length;\n\n // Create combined buffer\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const seed of allSeeds) {\n combined.set(seed, offset);\n offset += seed.length;\n }\n combined.set(programIdBytes, offset);\n offset += programIdBytes.length;\n combined.set(pda_marker, offset);\n\n // Hash\n const hash = sha256(combined);\n\n // Check if result is NOT on curve (valid PDA)\n if (!isOnCurve(hash)) {\n return {\n address: PublicKey.fromBytes(hash),\n bump,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Options for finding an Associated Token Address.\n */\nexport interface FindAssociatedTokenAddressOptions {\n /** The wallet's public key (owner of the token account) */\n wallet: PublicKey;\n /** The token mint's public key */\n mint: PublicKey;\n /** The token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Finds the Associated Token Address for a wallet and mint.\n *\n * The ATA is derived using the following seeds:\n * - wallet address (32 bytes)\n * - token program ID (32 bytes)\n * - mint address (32 bytes)\n *\n * @param options - Options containing wallet, mint, and optional programId\n * @returns The derived ATA address and bump seed\n * @throws {SplTokenError} If PDA derivation fails\n *\n * @example\n * ```typescript\n * const { address, bump } = findAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`ATA: ${address.toString()}`);\n * console.log(`Bump: ${bump}`);\n * ```\n */\nexport function findAssociatedTokenAddress({\n wallet,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: FindAssociatedTokenAddressOptions): AtaDerivationResult {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n\n // Seeds: [wallet, token_program_id, mint]\n const seeds = [wallet.toBytes(), programId.toBytes(), mint.toBytes()];\n\n const result = createProgramAddress({ seeds, programId: associatedTokenProgramId });\n\n if (!result) {\n throw SplTokenError.pdaDerivationFailed({\n reason: `Could not find valid PDA for wallet=${wallet.toString()}, mint=${mint.toString()}`,\n });\n }\n\n return result;\n}\n\n/**\n * Options for getting the Associated Token Address synchronously.\n */\nexport interface GetAssociatedTokenAddressSyncOptions {\n /** The wallet's public key */\n wallet: PublicKey;\n /** The token mint's public key */\n mint: PublicKey;\n /** The token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Gets the Associated Token Address without the bump seed.\n *\n * Convenience function when you only need the address.\n *\n * @param options - Options containing wallet, mint, and optional programId\n * @returns The derived ATA address\n */\nexport function getAssociatedTokenAddressSync({\n wallet,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: GetAssociatedTokenAddressSyncOptions): PublicKey {\n return findAssociatedTokenAddress({ wallet, mint, programId }).address;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Mint account parsing for SPL Token-2022.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n COPTION_SOME,\n MINT_DECIMALS_OFFSET,\n MINT_FREEZE_AUTHORITY_OFFSET,\n MINT_IS_INITIALIZED_OFFSET,\n MINT_SIZE,\n MINT_SUPPLY_OFFSET,\n PUBKEY_SIZE,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { MintInfo } from \"../types\";\n\n/**\n * Reads a little-endian u64 from a Uint8Array at the specified offset.\n */\nfunction readU64LE({ data, offset }: { data: Uint8Array; offset: number }): bigint {\n let value = 0n;\n for (let i = 0; i < 8; i++) {\n value |= BigInt(data[offset + i]) << BigInt(i * 8);\n }\n return value;\n}\n\n/**\n * Reads a little-endian u32 from a Uint8Array at the specified offset.\n */\nfunction readU32LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return (\n (data[offset] |\n (data[offset + 1] << 8) |\n (data[offset + 2] << 16) |\n (data[offset + 3] << 24)) >>>\n 0\n );\n}\n\n/**\n * Reads a COption<Pubkey> from account data.\n *\n * COption format: 4-byte LE tag (0=None, 1=Some) + 32-byte pubkey if Some\n *\n * @param options - Options containing data and offset\n * @returns The public key if Some, null if None\n */\nfunction readCOptionPubkey({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): PublicKey | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n const pubkeyBytes = data.slice(offset + 4, offset + 4 + PUBKEY_SIZE);\n return PublicKey.fromBytes(pubkeyBytes);\n }\n return null;\n}\n\n/**\n * Options for parsing a mint account.\n */\nexport interface ParseMintAccountOptions {\n /** The mint account's public key */\n address: PublicKey;\n /** Raw account data bytes (minimum 82 bytes) */\n data: Uint8Array;\n}\n\n/**\n * Parses raw mint account data into a structured MintInfo object.\n *\n * @param options - Options containing address and data\n * @returns Parsed mint information\n * @throws {SplTokenError} If the data is invalid or too short\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(mintPubkey);\n * if (accountInfo) {\n * const mintInfo = parseMintAccount({ address: mintPubkey, data: accountInfo.data });\n * console.log(`Supply: ${mintInfo.supply}`);\n * console.log(`Decimals: ${mintInfo.decimals}`);\n * }\n * ```\n */\nexport function parseMintAccount({ address, data }: ParseMintAccountOptions): MintInfo {\n if (data.length < MINT_SIZE) {\n throw SplTokenError.invalidMint({\n reason: `Account data too short: expected at least ${MINT_SIZE} bytes, got ${data.length}`,\n });\n }\n\n // Read mint authority (COption<Pubkey> at offset 0)\n const mintAuthority = readCOptionPubkey({ data, offset: 0 });\n\n // Read supply (u64 LE at offset 36)\n const supply = readU64LE({ data, offset: MINT_SUPPLY_OFFSET });\n\n // Read decimals (u8 at offset 44)\n const decimals = data[MINT_DECIMALS_OFFSET];\n\n // Read is_initialized (bool at offset 45)\n const isInitialized = data[MINT_IS_INITIALIZED_OFFSET] !== 0;\n\n // Read freeze authority (COption<Pubkey> at offset 46)\n const freezeAuthority = readCOptionPubkey({ data, offset: MINT_FREEZE_AUTHORITY_OFFSET });\n\n if (!isInitialized) {\n throw SplTokenError.accountNotInitialized({ address: address.toString() });\n }\n\n return {\n address,\n supply,\n decimals,\n isInitialized,\n mintAuthority,\n freezeAuthority,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Token account parsing for SPL Token-2022.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n COPTION_SOME,\n PUBKEY_SIZE,\n TOKEN_ACCOUNT_AMOUNT_OFFSET,\n TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET,\n TOKEN_ACCOUNT_DELEGATE_OFFSET,\n TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET,\n TOKEN_ACCOUNT_IS_NATIVE_OFFSET,\n TOKEN_ACCOUNT_MINT_OFFSET,\n TOKEN_ACCOUNT_OWNER_OFFSET,\n TOKEN_ACCOUNT_SIZE,\n TOKEN_ACCOUNT_STATE_OFFSET,\n TokenAccountState,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { TokenAccountInfo } from \"../types\";\n\n/**\n * Reads a little-endian u64 from a Uint8Array at the specified offset.\n */\nfunction readU64LE({ data, offset }: { data: Uint8Array; offset: number }): bigint {\n let value = 0n;\n for (let i = 0; i < 8; i++) {\n value |= BigInt(data[offset + i]) << BigInt(i * 8);\n }\n return value;\n}\n\n/**\n * Reads a little-endian u32 from a Uint8Array at the specified offset.\n */\nfunction readU32LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return (\n (data[offset] |\n (data[offset + 1] << 8) |\n (data[offset + 2] << 16) |\n (data[offset + 3] << 24)) >>>\n 0\n );\n}\n\n/**\n * Reads a COption<Pubkey> from account data.\n *\n * COption format: 4-byte LE tag (0=None, 1=Some) + 32-byte pubkey if Some\n */\nfunction readCOptionPubkey({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): PublicKey | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n const pubkeyBytes = data.slice(offset + 4, offset + 4 + PUBKEY_SIZE);\n return PublicKey.fromBytes(pubkeyBytes);\n }\n return null;\n}\n\n/**\n * Reads a COption<u64> from account data.\n *\n * COption format: 4-byte LE tag (0=None, 1=Some) + 8-byte u64 if Some\n */\nfunction readCOptionU64({ data, offset }: { data: Uint8Array; offset: number }): bigint | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n return readU64LE({ data, offset: offset + 4 });\n }\n return null;\n}\n\n/**\n * Options for parsing a token account.\n */\nexport interface ParseTokenAccountOptions {\n /** The token account's public key */\n address: PublicKey;\n /** Raw account data bytes (minimum 165 bytes) */\n data: Uint8Array;\n}\n\n/**\n * Parses raw token account data into a structured TokenAccountInfo object.\n *\n * @param options - Options containing address and data\n * @returns Parsed token account information\n * @throws {SplTokenError} If the data is invalid or too short\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(tokenAccountPubkey);\n * if (accountInfo) {\n * const tokenAccount = parseTokenAccount({ address: tokenAccountPubkey, data: accountInfo.data });\n * console.log(`Balance: ${tokenAccount.amount}`);\n * console.log(`Owner: ${tokenAccount.owner.toString()}`);\n * }\n * ```\n */\nexport function parseTokenAccount({ address, data }: ParseTokenAccountOptions): TokenAccountInfo {\n if (data.length < TOKEN_ACCOUNT_SIZE) {\n throw SplTokenError.invalidTokenAccount({\n reason: `Account data too short: expected at least ${TOKEN_ACCOUNT_SIZE} bytes, got ${data.length}`,\n });\n }\n\n // Read mint (Pubkey at offset 0)\n const mintBytes = data.slice(TOKEN_ACCOUNT_MINT_OFFSET, TOKEN_ACCOUNT_MINT_OFFSET + PUBKEY_SIZE);\n const mint = PublicKey.fromBytes(mintBytes);\n\n // Read owner (Pubkey at offset 32)\n const ownerBytes = data.slice(\n TOKEN_ACCOUNT_OWNER_OFFSET,\n TOKEN_ACCOUNT_OWNER_OFFSET + PUBKEY_SIZE,\n );\n const owner = PublicKey.fromBytes(ownerBytes);\n\n // Read amount (u64 LE at offset 64)\n const amount = readU64LE({ data, offset: TOKEN_ACCOUNT_AMOUNT_OFFSET });\n\n // Read delegate (COption<Pubkey> at offset 72)\n const delegate = readCOptionPubkey({ data, offset: TOKEN_ACCOUNT_DELEGATE_OFFSET });\n\n // Read state (u8 at offset 108)\n const stateValue = data[TOKEN_ACCOUNT_STATE_OFFSET];\n if (stateValue > 2) {\n throw SplTokenError.invalidTokenAccount({ reason: `Invalid account state: ${stateValue}` });\n }\n const state = stateValue as TokenAccountState;\n\n // Check if account is initialized\n if (state === TokenAccountState.Uninitialized) {\n throw SplTokenError.accountNotInitialized({ address: address.toString() });\n }\n\n // Read is_native (COption<u64> at offset 109)\n const isNative = readCOptionU64({ data, offset: TOKEN_ACCOUNT_IS_NATIVE_OFFSET });\n\n // Read delegated_amount (u64 LE at offset 121)\n const delegatedAmount = readU64LE({ data, offset: TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET });\n\n // Read close_authority (COption<Pubkey> at offset 129)\n const closeAuthority = readCOptionPubkey({ data, offset: TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET });\n\n return {\n address,\n mint,\n owner,\n amount,\n delegate,\n state,\n isNative,\n delegatedAmount,\n closeAuthority,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Token metadata parsing for SPL Token-2022 native metadata extension.\n *\n * This parses the TokenMetadata extension (ExtensionType=19) embedded in\n * Token-2022 mint accounts, not the separate Metaplex Token Metadata program.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n AccountType,\n COPTION_SOME,\n ExtensionType,\n MINT_EXTENSIONS_OFFSET,\n MINT_SIZE,\n PUBKEY_SIZE,\n TLV_LENGTH_SIZE,\n TLV_TYPE_SIZE,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { MetadataPointerExtension, RawExtension, TokenMetadata } from \"../types\";\n\n/**\n * Reads a little-endian u16 from a Uint8Array at the specified offset.\n */\nfunction readU16LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return data[offset] | (data[offset + 1] << 8);\n}\n\n/**\n * Reads a little-endian u32 from a Uint8Array at the specified offset.\n */\nfunction readU32LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return (\n (data[offset] |\n (data[offset + 1] << 8) |\n (data[offset + 2] << 16) |\n (data[offset + 3] << 24)) >>>\n 0\n );\n}\n\n/**\n * Reads a COption<Pubkey> from data.\n */\nfunction readCOptionPubkey({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): PublicKey | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n const pubkeyBytes = data.slice(offset + 4, offset + 4 + PUBKEY_SIZE);\n return PublicKey.fromBytes(pubkeyBytes);\n }\n return null;\n}\n\n/**\n * Reads a length-prefixed string from data.\n *\n * Format: 4-byte LE length + UTF-8 string bytes\n *\n * @returns Tuple of [string, bytes consumed]\n */\nfunction readLengthPrefixedString({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): [string, number] {\n if (offset + 4 > data.length) {\n throw SplTokenError.invalidMetadata({ reason: \"String length prefix extends beyond data\" });\n }\n\n const length = readU32LE({ data, offset });\n\n if (offset + 4 + length > data.length) {\n throw SplTokenError.invalidMetadata({\n reason: `String data extends beyond buffer: need ${length} bytes at offset ${offset + 4}`,\n });\n }\n\n const stringBytes = data.slice(offset + 4, offset + 4 + length);\n try {\n const str = new TextDecoder().decode(stringBytes);\n return [str, 4 + length];\n } catch (error) {\n throw SplTokenError.invalidMetadata({\n reason: `Invalid UTF-8 string at offset ${offset}`,\n });\n }\n}\n\n/**\n * Parses all TLV extensions from account data.\n *\n * @param options - Options containing data and extensionsOffset\n * @returns Array of raw extensions\n */\nfunction parseExtensions({\n data,\n extensionsOffset,\n}: {\n data: Uint8Array;\n extensionsOffset: number;\n}): RawExtension[] {\n const extensions: RawExtension[] = [];\n let offset = extensionsOffset;\n\n while (offset + TLV_TYPE_SIZE + TLV_LENGTH_SIZE <= data.length) {\n const type = readU16LE({ data, offset });\n const length = readU16LE({ data, offset: offset + TLV_TYPE_SIZE });\n\n // Type 0 with length 0 means end of extensions or padding\n if (type === 0 && length === 0) {\n break;\n }\n\n const dataStart = offset + TLV_TYPE_SIZE + TLV_LENGTH_SIZE;\n const dataEnd = dataStart + length;\n\n if (dataEnd > data.length) {\n throw SplTokenError.invalidExtension({\n reason: `Extension data extends beyond buffer: type=${type}, length=${length}`,\n });\n }\n\n extensions.push({\n type,\n data: data.slice(dataStart, dataEnd),\n });\n\n offset = dataEnd;\n }\n\n return extensions;\n}\n\n/**\n * Parses a MetadataPointer extension.\n *\n * Layout:\n * - COption<Pubkey> authority (36 bytes)\n * - COption<Pubkey> metadata_address (36 bytes)\n */\nfunction parseMetadataPointer({ data }: { data: Uint8Array }): MetadataPointerExtension {\n if (data.length < 72) {\n throw SplTokenError.invalidExtension({\n reason: `MetadataPointer too short: expected 72 bytes, got ${data.length}`,\n });\n }\n\n const authority = readCOptionPubkey({ data, offset: 0 });\n const metadataAddress = readCOptionPubkey({ data, offset: 36 });\n\n return { authority, metadataAddress };\n}\n\n/**\n * Parses a TokenMetadata extension.\n *\n * Layout:\n * - Pubkey update_authority (32 bytes) - can be all zeros for None\n * - Pubkey mint (32 bytes)\n * - String name (4-byte length + UTF-8)\n * - String symbol (4-byte length + UTF-8)\n * - String uri (4-byte length + UTF-8)\n * - Vec<(String, String)> additional_metadata\n */\nfunction parseTokenMetadataExtension({\n data,\n mint,\n}: {\n data: Uint8Array;\n mint: PublicKey;\n}): TokenMetadata {\n if (data.length < 64) {\n throw SplTokenError.invalidMetadata({\n reason: `TokenMetadata too short: expected at least 64 bytes, got ${data.length}`,\n });\n }\n\n let offset = 0;\n\n // Read update_authority (32 bytes, all zeros = None)\n const updateAuthorityBytes = data.slice(offset, offset + PUBKEY_SIZE);\n const isZeroAuthority = updateAuthorityBytes.every(b => b === 0);\n const updateAuthority = isZeroAuthority ? null : PublicKey.fromBytes(updateAuthorityBytes);\n offset += PUBKEY_SIZE;\n\n // Read mint (32 bytes) - skip, we already have it\n offset += PUBKEY_SIZE;\n\n // Read name\n const [name, nameLen] = readLengthPrefixedString({ data, offset });\n offset += nameLen;\n\n // Read symbol\n const [symbol, symbolLen] = readLengthPrefixedString({ data, offset });\n offset += symbolLen;\n\n // Read uri\n const [uri, uriLen] = readLengthPrefixedString({ data, offset });\n offset += uriLen;\n\n // Read additional_metadata (Vec<(String, String)>)\n const additionalMetadata: Array<[string, string]> = [];\n\n if (offset + 4 <= data.length) {\n const numEntries = readU32LE({ data, offset });\n offset += 4;\n\n for (let i = 0; i < numEntries && offset < data.length; i++) {\n const [key, keyLen] = readLengthPrefixedString({ data, offset });\n offset += keyLen;\n\n const [value, valueLen] = readLengthPrefixedString({ data, offset });\n offset += valueLen;\n\n additionalMetadata.push([key, value]);\n }\n }\n\n return {\n updateAuthority,\n mint,\n name,\n symbol,\n uri,\n additionalMetadata,\n };\n}\n\n/**\n * Options for parsing token metadata.\n */\nexport interface ParseTokenMetadataOptions {\n /** The mint's public key */\n mint: PublicKey;\n /** Raw mint account data (including extensions) */\n data: Uint8Array;\n}\n\n/**\n * Parses Token-2022 native metadata from a mint account.\n *\n * This function looks for the TokenMetadata extension (type 19) in the\n * account's extension data and parses it if found.\n *\n * @param options - Options containing mint and data\n * @returns Parsed token metadata, or null if no metadata extension exists\n * @throws {SplTokenError} If the metadata extension is malformed\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(mintPubkey);\n * if (accountInfo) {\n * const metadata = parseTokenMetadata({ mint: mintPubkey, data: accountInfo.data });\n * if (metadata) {\n * console.log(`Name: ${metadata.name}`);\n * console.log(`Symbol: ${metadata.symbol}`);\n * console.log(`URI: ${metadata.uri}`);\n * }\n * }\n * ```\n */\nexport function parseTokenMetadata({\n mint,\n data,\n}: ParseTokenMetadataOptions): TokenMetadata | null {\n // Check if account has extensions (must be longer than base mint size)\n if (data.length <= MINT_SIZE) {\n return null;\n }\n\n // Check AccountType byte\n const accountType = data[MINT_SIZE];\n if (accountType !== AccountType.Mint) {\n return null;\n }\n\n // Parse all extensions\n const extensions = parseExtensions({ data, extensionsOffset: MINT_EXTENSIONS_OFFSET });\n\n // Find TokenMetadata extension (type 19)\n const metadataExt = extensions.find(ext => ext.type === ExtensionType.TokenMetadata);\n\n if (!metadataExt) {\n return null;\n }\n\n return parseTokenMetadataExtension({ data: metadataExt.data, mint });\n}\n\n/**\n * Options for parsing metadata pointer extension.\n */\nexport interface ParseMetadataPointerExtensionOptions {\n /** Raw mint account data (including extensions) */\n data: Uint8Array;\n}\n\n/**\n * Parses the MetadataPointer extension from a mint account.\n *\n * @param options - Options containing data\n * @returns Parsed metadata pointer, or null if not present\n */\nexport function parseMetadataPointerExtension({\n data,\n}: ParseMetadataPointerExtensionOptions): MetadataPointerExtension | null {\n if (data.length <= MINT_SIZE) {\n return null;\n }\n\n const accountType = data[MINT_SIZE];\n if (accountType !== AccountType.Mint) {\n return null;\n }\n\n const extensions = parseExtensions({ data, extensionsOffset: MINT_EXTENSIONS_OFFSET });\n const pointerExt = extensions.find(ext => ext.type === ExtensionType.MetadataPointer);\n\n if (!pointerExt) {\n return null;\n }\n\n return parseMetadataPointer({ data: pointerExt.data });\n}\n\n/**\n * Options for getting mint extensions.\n */\nexport interface GetMintExtensionsOptions {\n /** Raw mint account data */\n data: Uint8Array;\n}\n\n/**\n * Gets all raw extensions from a mint account.\n *\n * @param options - Options containing data\n * @returns Array of raw extensions, or empty array if no extensions\n */\nexport function getMintExtensions({ data }: GetMintExtensionsOptions): RawExtension[] {\n if (data.length <= MINT_SIZE) {\n return [];\n }\n\n const accountType = data[MINT_SIZE];\n if (accountType !== AccountType.Mint) {\n return [];\n }\n\n return parseExtensions({ data, extensionsOffset: MINT_EXTENSIONS_OFFSET });\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * High-level SPL Token-2022 client for token operations.\n *\n * Provides a convenient API for common token operations like getting\n * balances, reading mint info, and building transfer transactions.\n */\n\nimport { PublicKey, type RialoClient, type Signer, TransactionBuilder } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\n\n/**\n * Decode account data from the RPC wire format (`[base64data, \"base64\"]`)\n * into raw bytes. Also accepts Uint8Array passthrough for test mocks.\n */\nfunction decodeAccountData(data: string[] | Uint8Array): Uint8Array {\n\tif (data instanceof Uint8Array) return data;\n\tconst encoded = data[0];\n\tconst binaryStr = atob(encoded);\n\tconst bytes = new Uint8Array(binaryStr.length);\n\tfor (let i = 0; i < binaryStr.length; i++) {\n\t\tbytes[i] = binaryStr.charCodeAt(i);\n\t}\n\treturn bytes;\n}\nimport {\n type Instruction,\n createAssociatedTokenAccountIdempotentInstruction,\n transferCheckedInstruction,\n} from \"../instructions\";\nimport { findAssociatedTokenAddress, getAssociatedTokenAddressSync } from \"../pda\";\nimport { parseMintAccount, parseTokenAccount, parseTokenMetadata } from \"../state\";\nimport type {\n AtaDerivationResult,\n MintInfo,\n TokenAccountInfo,\n TokenMetadata,\n TransferParams,\n} from \"../types\";\n\n/**\n * Options for creating an SplTokenClient.\n */\nexport interface SplTokenClientOptions {\n /** The underlying RialoClient for RPC calls */\n client: RialoClient;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * High-level client for SPL Token-2022 operations.\n *\n * Wraps a RialoClient to provide token-specific functionality including\n * reading mint/token account data, getting balances, and building transfers.\n *\n * @example\n * ```typescript\n * import { createRialoClient, RIALO_DEVNET_CHAIN } from '@rialo/ts-cdk';\n * import { createSplTokenClient } from '@rialo/spl-token';\n *\n * const rialoClient = createRialoClient({ chain: RIALO_DEVNET_CHAIN });\n * const tokenClient = createSplTokenClient({ client: rialoClient });\n *\n * // Get token balance\n * const balance = await tokenClient.getBalance({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`Balance: ${balance}`);\n *\n * // Get mint info\n * const mintInfo = await tokenClient.getMintInfo({ mint: mintPubkey });\n * console.log(`Supply: ${mintInfo.supply}, Decimals: ${mintInfo.decimals}`);\n * ```\n */\nexport class SplTokenClient {\n private readonly client: RialoClient;\n private readonly programId: PublicKey;\n\n /**\n * Creates a new SplTokenClient.\n *\n * @param options - Client configuration options\n */\n constructor({\n client,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n }: SplTokenClientOptions) {\n this.client = client;\n this.programId = programId;\n }\n\n /**\n * Gets the token program ID this client is configured to use.\n */\n getProgramId(): PublicKey {\n return this.programId;\n }\n\n /**\n * Retrieves mint account information.\n *\n * @param options - Options containing the mint public key\n * @returns Parsed mint information including supply, decimals, and authorities\n * @throws {SplTokenError} If the mint account doesn't exist or is invalid\n *\n * @example\n * ```typescript\n * const mintInfo = await tokenClient.getMintInfo({ mint: mintPubkey });\n * console.log(`Supply: ${mintInfo.supply}`);\n * console.log(`Decimals: ${mintInfo.decimals}`);\n * console.log(`Mint Authority: ${mintInfo.mintAuthority?.toString() ?? 'disabled'}`);\n * ```\n */\n async getMintInfo({ mint }: { mint: PublicKey }): Promise<MintInfo> {\n const accountInfo = await this.client.getAccountInfo(mint);\n\n if (!accountInfo) {\n throw SplTokenError.mintNotFound({ address: mint.toString() });\n }\n\n return parseMintAccount({ address: mint, data: decodeAccountData(accountInfo.data) });\n }\n\n /**\n * Retrieves Token-2022 native metadata from a mint.\n *\n * @param options - Options containing the mint public key\n * @returns Parsed token metadata, or null if no metadata extension exists\n * @throws {SplTokenError} If the mint account doesn't exist\n *\n * @example\n * ```typescript\n * const metadata = await tokenClient.getTokenMetadata({ mint: mintPubkey });\n * if (metadata) {\n * console.log(`Name: ${metadata.name}`);\n * console.log(`Symbol: ${metadata.symbol}`);\n * console.log(`URI: ${metadata.uri}`);\n * }\n * ```\n */\n async getTokenMetadata({ mint }: { mint: PublicKey }): Promise<TokenMetadata | null> {\n const accountInfo = await this.client.getAccountInfo(mint);\n\n if (!accountInfo) {\n throw SplTokenError.mintNotFound({ address: mint.toString() });\n }\n\n return parseTokenMetadata({ mint, data: decodeAccountData(accountInfo.data) });\n }\n\n /**\n * Retrieves token account information.\n *\n * @param options - Options containing the token account public key\n * @returns Parsed token account information\n * @throws {SplTokenError} If the account doesn't exist or is invalid\n */\n async getTokenAccountInfo({\n tokenAccount,\n }: {\n tokenAccount: PublicKey;\n }): Promise<TokenAccountInfo> {\n const accountInfo = await this.client.getAccountInfo(tokenAccount);\n\n if (!accountInfo) {\n throw SplTokenError.tokenAccountNotFound({ address: tokenAccount.toString() });\n }\n\n return parseTokenAccount({ address: tokenAccount, data: decodeAccountData(accountInfo.data) });\n }\n\n /**\n * Gets the token balance for a wallet.\n *\n * Automatically derives the Associated Token Address for the wallet/mint\n * combination and retrieves the balance.\n *\n * @param options - Options containing wallet and mint public keys\n * @returns The token balance in smallest units, or 0n if the ATA doesn't exist\n *\n * @example\n * ```typescript\n * const balance = await tokenClient.getBalance({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`Token balance: ${balance}`);\n * ```\n */\n async getBalance({ wallet, mint }: { wallet: PublicKey; mint: PublicKey }): Promise<bigint> {\n const ata = getAssociatedTokenAddressSync({ wallet, mint, programId: this.programId });\n const accountInfo = await this.client.getAccountInfo(ata);\n\n if (!accountInfo) {\n // ATA doesn't exist, balance is 0\n return 0n;\n }\n\n const tokenAccount = parseTokenAccount({ address: ata, data: decodeAccountData(accountInfo.data) });\n return tokenAccount.amount;\n }\n\n /**\n * Derives the Associated Token Address for a wallet and mint.\n *\n * @param options - Options containing wallet and mint public keys\n * @returns The derived ATA address and bump seed\n *\n * @example\n * ```typescript\n * const { address, bump } = tokenClient.getAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`ATA: ${address.toString()}`);\n * ```\n */\n getAssociatedTokenAddress({\n wallet,\n mint,\n }: {\n wallet: PublicKey;\n mint: PublicKey;\n }): AtaDerivationResult {\n return findAssociatedTokenAddress({ wallet, mint, programId: this.programId });\n }\n\n /**\n * Checks if an Associated Token Account exists.\n *\n * @param options - Options containing wallet and mint public keys\n * @returns True if the ATA exists, false otherwise\n */\n async ataExists({ wallet, mint }: { wallet: PublicKey; mint: PublicKey }): Promise<boolean> {\n const ata = getAssociatedTokenAddressSync({ wallet, mint, programId: this.programId });\n const accountInfo = await this.client.getAccountInfo(ata);\n return accountInfo !== null;\n }\n\n /**\n * Creates instructions for a token transfer.\n *\n * This builds the necessary instructions for transferring tokens,\n * optionally creating the destination ATA if it doesn't exist.\n *\n * @param params - Transfer parameters\n * @returns Array of instructions to execute\n * @throws {SplTokenError} If the mint doesn't exist\n *\n * @example\n * ```typescript\n * const instructions = await tokenClient.createTransferInstructions({\n * source: senderWallet,\n * destination: recipientWallet,\n * mint: mintPubkey,\n * amount: 1000000n,\n * decimals: 6,\n * createDestinationAta: true,\n * });\n * ```\n */\n async createTransferInstructions(params: TransferParams): Promise<Instruction[]> {\n const { source, destination, mint, amount, decimals, createDestinationAta = true } = params;\n\n const instructions: Instruction[] = [];\n\n // Derive ATAs\n const sourceAta = getAssociatedTokenAddressSync({\n wallet: source,\n mint,\n programId: this.programId,\n });\n const destinationAta = getAssociatedTokenAddressSync({\n wallet: destination,\n mint,\n programId: this.programId,\n });\n\n // Check if we need to create destination ATA\n if (createDestinationAta) {\n const destExists = await this.ataExists({ wallet: destination, mint });\n if (!destExists) {\n // Add idempotent create instruction (safe even if it exists)\n instructions.push(\n createAssociatedTokenAccountIdempotentInstruction({\n payer: source,\n associatedToken: destinationAta,\n owner: destination,\n mint,\n programId: this.programId,\n }),\n );\n }\n }\n\n // Add transfer instruction\n instructions.push(\n transferCheckedInstruction({\n source: sourceAta,\n mint,\n destination: destinationAta,\n authority: source,\n amount,\n decimals,\n programId: this.programId,\n }),\n );\n\n return instructions;\n }\n\n /**\n * Options for creating a transfer transaction.\n */\n /**\n * Creates a transaction for a token transfer.\n *\n * Builds a complete transaction with all necessary instructions for\n * transferring tokens, including ATA creation if needed.\n *\n * @param options - Options containing params and validFrom\n * @returns Built transaction ready for signing\n *\n * @example\n * ```typescript\n * const blockHeight = await rialoClient.getBlockHeight();\n * const configHashPrefix = await rialoClient.getConfigHashPrefix();\n * const tx = await tokenClient.createTransferTransaction({\n * params: {\n * source: senderWallet,\n * destination: recipientWallet,\n * mint: mintPubkey,\n * amount: 1000000n,\n * decimals: 6,\n * },\n * validFrom: blockHeight,\n * configHashPrefix,\n * });\n *\n * // Sign and send\n * const signedTx = tx.sign([signer]);\n * const signature = await rialoClient.sendTransaction(signedTx.serialize());\n * ```\n */\n async createTransferTransaction({\n params,\n validFrom,\n configHashPrefix,\n }: {\n params: TransferParams;\n validFrom: bigint;\n configHashPrefix: bigint;\n }): Promise<ReturnType<typeof TransactionBuilder.prototype.build>> {\n const instructions = await this.createTransferInstructions(params);\n\n const builder = TransactionBuilder.create()\n .setPayer(params.source)\n .setValidFrom(validFrom)\n .setConfigHashPrefix(configHashPrefix);\n\n for (const ix of instructions) {\n builder.addInstruction(ix);\n }\n\n return builder.build();\n }\n\n /**\n * Transfers tokens from one wallet to another.\n *\n * This is a high-level convenience method that:\n * 1. Creates the destination ATA if needed\n * 2. Builds the transfer transaction\n * 3. Signs and sends the transaction\n * 4. Waits for confirmation\n *\n * @param options - Options containing params, validFrom, and signer\n * @returns Transaction signature\n *\n * @example\n * ```typescript\n * const blockHeight = await rialoClient.getBlockHeight();\n * const configHashPrefix = await rialoClient.getConfigHashPrefix();\n * const signature = await tokenClient.transfer({\n * params: {\n * source: senderWallet,\n * destination: recipientWallet,\n * mint: mintPubkey,\n * amount: 1000000n,\n * decimals: 6,\n * },\n * validFrom: blockHeight,\n * configHashPrefix,\n * signer: senderSigner,\n * });\n * console.log(`Transfer complete: ${signature}`);\n * ```\n */\n async transfer({\n params,\n validFrom,\n configHashPrefix,\n signer,\n }: {\n params: TransferParams;\n validFrom: bigint;\n configHashPrefix: bigint;\n signer: Signer;\n }): Promise<string> {\n const tx = await this.createTransferTransaction({ params, validFrom, configHashPrefix });\n const signedTx = await tx.signWith(signer);\n const result = await this.client.sendAndConfirmTransaction(signedTx.serialize());\n return result.signature;\n }\n}\n\n/**\n * Options for creating an SplTokenClient via the factory function.\n */\nexport interface CreateSplTokenClientOptions {\n /** The underlying RialoClient for RPC calls */\n client: RialoClient;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a new SplTokenClient.\n *\n * Factory function for creating an SplTokenClient instance.\n *\n * @param options - Options for creating the client\n * @returns Configured SplTokenClient instance\n *\n * @example\n * ```typescript\n * import { createRialoClient, RIALO_DEVNET_CHAIN } from '@rialo/ts-cdk';\n * import { createSplTokenClient } from '@rialo/spl-token';\n *\n * const rialoClient = createRialoClient({ chain: RIALO_DEVNET_CHAIN });\n * const tokenClient = createSplTokenClient({ client: rialoClient });\n * ```\n */\nexport function createSplTokenClient({\n client,\n programId,\n}: CreateSplTokenClientOptions): SplTokenClient {\n return new SplTokenClient({ client, programId });\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@rialo/spl-token",
3
+ "version": "0.3.0-alpha.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "SPL Token-2022 client library for the Rialo blockchain",
8
+ "license": "Apache-2.0",
9
+ "author": "Subzero Labs",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/SubzeroLabs/rialo.git"
13
+ },
14
+ "main": "dist/index.js",
15
+ "module": "dist/index.mjs",
16
+ "types": "dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.mjs",
21
+ "require": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": ["dist", "README.md", "LICENSE"],
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "dev": "tsup --watch",
28
+ "test": "vitest run",
29
+ "test:coverage": "vitest --coverage",
30
+ "lint": "biome lint .",
31
+ "format": "biome format . --write",
32
+ "check": "biome check .",
33
+ "typecheck": "tsc --noEmit",
34
+ "release": "npm run build && npm publish",
35
+ "version:bump": "npm version patch",
36
+ "clean": "rm -rf node_modules dist"
37
+ },
38
+ "dependencies": {
39
+ "@noble/hashes": "2.0.0"
40
+ },
41
+ "peerDependencies": {
42
+ "@rialo/ts-cdk": "^0.3.0-alpha.0"
43
+ },
44
+ "devDependencies": {
45
+ "@biomejs/biome": "^1.9.4",
46
+ "@rialo/ts-cdk": "file:../../rialo-ts-cdk",
47
+ "@types/node": "^22.10.5",
48
+ "tsup": "^8.3.5",
49
+ "tsx": "^4.20.6",
50
+ "typescript": "^5.7.2",
51
+ "vitest": "^4.0.4"
52
+ },
53
+ "keywords": ["rialo", "spl-token", "token-2022", "blockchain", "token", "transfer", "ata"],
54
+ "engines": {
55
+ "node": ">=18.0.0"
56
+ }
57
+ }